从异步方法访问 Neo4j

Accessing Neo4j from Async method

我的网络应用程序使用 Neo4j 作为数据存储,它使用 Spring Data Neo4j 4 框架。

按照教程中的建议,我的 neo4j 会话绑定到我的 HTTP 会话:

@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public Session getSession() throws Exception {
    return super.getSession();
}

我有一个运行耗时查询并离线发送结果的端点。我想将此方法移动到 @Async 线程,但显然我无法从该线程访问我的 neo4j 会话。

在不更改 "main" 会话 bean 的范围的情况下访问 HTTP 会话之外的 neo4j 存储库的最佳实践是什么?

我不确定最佳实践,但您不能从 sessionFactory#openSession() 方法创建另一个会话吗?并将该新会话传递给 neo4jOperations 的另一个实例(如果不使用它,则 @Override 现有 bean)从而避免使用 proxyScoped Neo4jConfiguration#getSession() 方法。

像这样:

// note below assumes you are extending Neo4jConfiguration

// ... 

// passing in your own non proxyScoped session. 
// @Override existing neo4jTemplate @Bean passing in your own session

@Bean
@Override
public Neo4jOperations neo4jTemplate() throws Exception {
    return new Neo4jTemplate(getSessionFactory().openSession());
}

// or create another neo4jTemplate instance that avoids getSession() proxyScope method usage in its constructor. 

@Bean("nonProxyScopedNeo4jOperations")
public Neo4jOperations nonProxyScopedNeo4jTemplate() throws Exception {
    return new Neo4jTemplate(getSessionFactory().openSession());
}

// ...

并使用自定义 neo4jOperations bean 来执行您的 @Async 逻辑

参见Neo4jConfiguration

我最终将我的 neo4jSession 移动到了 thread 范围。由于我们的应用程序是无状态的,因此我们的 session 只有一个 request。由于每个请求都在单独的线程中处理,thread scope 是最简单的方法。

我要感谢 https://github.com/devbury/spring-boot-starter-threadscope 的开发者,让我的生活更轻松。 :)