是否有API关闭Neo4j-ogm中的Session?

时间:2016-03-18 16:39:03

标签: java spring session neo4j neo4j-ogm

我正在使用neo4j-ogm 1.1.4版本。 由于我使用org.springframework.data.neo4j.template.Neo4jTemplate,我自己使用会话对象创建,我想知道是否有合同,一旦我的所有工作完成,那么我必须标记会话关闭。

我遇到了这个链接

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

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

2 个答案:

答案 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);
    }
  }

}