我正在使用neo4j-ogm 1.1.4版本。 由于我使用org.springframework.data.neo4j.template.Neo4jTemplate,我自己使用会话对象创建,我想知道是否有合同,一旦我的所有工作完成,那么我必须标记会话关闭。
我遇到了这个链接
http://inner-loop.github.io/java-neo4j-ogm/
但是我使用的库似乎没有关于Session类的密切方法。我需要使用其他API来标记会话已关闭吗?
答案 0 :(得分:4)
技术上没有必要"关闭" Neo4j OGM中的会议。它不代表与数据库的连接,而是在应用程序和数据库之间保持对话状态,允许OGM在加载和保存对象的工作单元时生成有效的Cypher。 (根据您的申请定义)。
有两种方法可以破坏这种会话状态。从应用程序代码的角度来看,它们都具有相同的效果。
<强>复用强>
session.clear()
允许您通过删除现有的会话状态来重用现有的会话对象。
<强>替换强>
session = sessionFactory.openSession()
会用新的session
替换任何当前@Value("#{'${set.test}'.split(',')}")
个对象。
这两个操作都将使OGM没有关于域对象与图形的同步状态的信息。 (在Hibernate术语中,它们处于“分离状态”状态)OGM目前没有机制将域对象重新附加到新会话,因此您应该始终重新加载所有您要用于新会话的对象。
答案 1 :(得分:0)
我需要在后端处理多个数据库连接。因此,我实现了一个SPRING BOOT
无边界池,该池“有效”。这可以处理@Vince答案中提到的clear
;
@Component
public class Neo4jOGMSessionPool implements ApplicationListener<RequestHandledEvent> {
private @Value("${neo4j.uri}") String uri;
private @Value("${neo4j.username}") String username;
private @Value("${neo4j.password}") String password;
private final Map<String, LinkedBlockingQueue<Session>> queues = new ConcurrentHashMap<>();
private final ThreadLocal<Entry<String, Session>> threadLocal = new ThreadLocal<>();
public synchronized Session getSession(String databaseName) {
LinkedBlockingQueue<Session> queue = queues.computeIfAbsent(databaseName, k -> new LinkedBlockingQueue<>());
Session session = queue.poll();
if (session == null) {
Configuration configuration = new Configuration.Builder().uri(uri).credentials(username, password).database(databaseName).verifyConnection(true).build();
SessionFactory sessionFactory = new SessionFactory(configuration, "no.package");
session = sessionFactory.openSession();
}
threadLocal.set(Maps.immutableEntry(databaseName, session));
return session;
}
@Override
public void onApplicationEvent(RequestHandledEvent event) {
Entry<String, Session> entry = threadLocal.get();
if (entry != null) {
Session session = entry.getValue();
session.clear();
threadLocal.remove();
queues.get(entry.getKey()).add(session);
}
}
}