从异步方法访问 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 逻辑
我最终将我的 neo4jSession 移动到了 thread
范围。由于我们的应用程序是无状态的,因此我们的 session
只有一个 request
。由于每个请求都在单独的线程中处理,thread
scope 是最简单的方法。
我要感谢 https://github.com/devbury/spring-boot-starter-threadscope 的开发者,让我的生活更轻松。 :)
我的网络应用程序使用 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 逻辑
我最终将我的 neo4jSession 移动到了 thread
范围。由于我们的应用程序是无状态的,因此我们的 session
只有一个 request
。由于每个请求都在单独的线程中处理,thread
scope 是最简单的方法。
我要感谢 https://github.com/devbury/spring-boot-starter-threadscope 的开发者,让我的生活更轻松。 :)