首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Neo4j-ogm中是否有关闭会话的API?

在Neo4j-ogm中是否有关闭会话的API?
EN

Stack Overflow用户
提问于 2016-03-18 16:39:02
回答 2查看 1.6K关注 0票数 2

我使用的是新4j-ogm 1.1.4版本。由于我使用自己使用session对象创建的org.springframework.data.neo4j.template.Neo4jTemplate,我想知道是否有一个契约,即一旦完成所有工作,就必须标记会话关闭。

我偶然发现了这个链接

http://inner-loop.github.io/java-neo4j-ogm/

但是,我使用的库似乎没有关于会话类的关闭方法。我是否需要使用其他API来标记会话已关闭?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-18 17:53:03

从技术上讲,没有必要在Neo4j OGM中“关闭”会话。它不代表到数据库的连接,而是维护应用程序和数据库之间的会话状态,允许OGM在“工作单元”(由应用程序定义)中加载和保存对象时生成高效的Cypher。

有两种方法可以破坏这种对话状态。从应用程序代码的角度来看,它们都具有相同的效果。

重用

session.clear()允许您通过删除现有会话状态来重用现有会话对象。

取代

session = sessionFactory.openSession()将用一个新的对象替换任何当前的session对象。

这两个操作都将使OGM没有关于域对象与图形的同步状态的信息。(在Hibernate中,它们处于“分离”状态) OGM目前没有将您的域对象重新附加到一个新会话的机制,因此您应该始终将所有要使用的对象重新加载到新会话中。

票数 5
EN

Stack Overflow用户

发布于 2020-08-14 18:13:09

我需要在后端处理多个数据库连接。因此,我实现了一个“工作”的SPRING BOOT无界池。这处理@Vince答复中提到的clear

代码语言:javascript
复制
@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);
    }
  }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36089756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档