我使用的是新4j-ogm 1.1.4版本。由于我使用自己使用session对象创建的org.springframework.data.neo4j.template.Neo4jTemplate,我想知道是否有一个契约,即一旦完成所有工作,就必须标记会话关闭。
我偶然发现了这个链接
http://inner-loop.github.io/java-neo4j-ogm/
但是,我使用的库似乎没有关于会话类的关闭方法。我是否需要使用其他API来标记会话已关闭?
发布于 2016-03-18 17:53:03
从技术上讲,没有必要在Neo4j OGM中“关闭”会话。它不代表到数据库的连接,而是维护应用程序和数据库之间的会话状态,允许OGM在“工作单元”(由应用程序定义)中加载和保存对象时生成高效的Cypher。
有两种方法可以破坏这种对话状态。从应用程序代码的角度来看,它们都具有相同的效果。
重用
session.clear()允许您通过删除现有会话状态来重用现有会话对象。
取代
session = sessionFactory.openSession()将用一个新的对象替换任何当前的session对象。
这两个操作都将使OGM没有关于域对象与图形的同步状态的信息。(在Hibernate中,它们处于“分离”状态) OGM目前没有将您的域对象重新附加到一个新会话的机制,因此您应该始终将所有要使用的对象重新加载到新会话中。
发布于 2020-08-14 18:13:09
我需要在后端处理多个数据库连接。因此,我实现了一个“工作”的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);
}
}
}https://stackoverflow.com/questions/36089756
复制相似问题