我的Web应用程序使用Neo4j作为数据存储,它使用Spring Data Neo4j 4框架。
正如教程中所建议的,我的neo4j会话绑定到我的HTTP会话:
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public Session getSession() throws Exception {
return super.getSession();
}
我有一个运行耗时查询的端点,并将结果脱机发送。我想将此方法移动到@Async
线程,但显然我无法从该线程访问我的neo4j会话。
在不改变“主”会话bean范围的情况下,在HTTP会话之外访问neo4j存储库的最佳做法是什么?
答案 0 :(得分:1)
我不确定最佳做法,但您是否只能使用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逻辑
答案 1 :(得分:1)
我最终将我的neo4jSession移动到thread
范围。由于我们的申请是无国籍的,我们的session
只有一个request
。并且由于每个请求都在一个单独的线程中处理,thread
范围是最简单的方法。
我要感谢https://github.com/devbury/spring-boot-starter-threadscope的开发人员,让我的生活更轻松。 :)