在SDN 4.1.X中使用带有prototype
注释的Session
范围@Transactional
时,我看到以下异常:
org.neo4j.ogm.exception.TransactionManagerException: "Transaction is not current for this thread"
我最近将Spring Boot项目升级到SDN 4.1.X和Neo4j OGM 2.0.3。似乎当启动多个Session
时(由于prototype
作用域),DefaultTransactionManager
无法在提交期间找到先前打开的事务的引用。
我发现每次创建会话时都会删除静态ThreadLocal
。
但同样的项目在SDN 4.0.0和OGM 1.1.4版本上运行良好。因此,作为一种解决方法,我必须使Session
thread
作用域。任何人都可以澄清对SDN / OGM做出哪些修改可能导致这种情况。或者这是SDN 4.1.X中的预期行为?
答案 0 :(得分:0)
感谢您的回复。
让我澄清一下应用范围。 我的应用程序是异步/并发的,并且在本质上由Reactor提供非阻塞。
并发性由基于池的分组的Reactor-Stream API控制。 这意味着数据通过并发线程(工作者)存储在Neo4J中 基于特定应用程序特定分组上下文创建的多个组(线程池)。 在一个组内,与Neo4J的交互始终是连续的。
因此,以下是我为Neo4J会议考虑的选项,(我在配置中使用了@EnableTransactionManagement
,在与Neo4J交互的方法中使用了@Transactional
)
"session"
- 这不能用作应用程序(主要是后端应用程序)不使用Spring-MVC容器"prototype"
- 表示将为每个数据库命中初始化新的会话对象。这适用于SDN 4.0.0和OGM 1.x.
但是升级后的库不再适用了。会话是容器管理的,不会在事务边界之外进一步使用"thread"
- 这需要明确注册范围。但是,会话在整个线程生命周期中仍然存在。
这确实会扩展内存占用量,应该重复清理/刷新以保持数据完整性。我还考虑升级到SDN 4.2.X,但是唯一的SNAPSHOT可用,我对此有点怀疑。
另外,我发现当删除事务方面(@EnableTransactionManagement)
时,它可以正常工作。但我想知道,是否正确处理交易。
对Neo4J OGM的事务管理感到困惑,其中会话无法在Singleton或Session范围内初始化?或者围绕这些场景的首选工作是什么?
答案 1 :(得分:0)
好的,我想我理解这些问题。
在SDN 4.2 / OGM 2.1之前,配置和交易的完成方式截然不同。用户需要在扩展Session
的配置类中的Neo4jConfiguration
bean上定义和指定范围。这导致开发人员在其应用程序的使用范围方面存在很多混淆。在这个最新版本中,这已完全废除。您可以在this blog post中查看如何升级。我们也不会支持这种旧的配置机制。
新版本的SDN将在本月底RC1
和RELEASE
12月12日左右,因此SNAPSHOT
的时间不会太长!< / p>
博客文章还讨论了交易如何运作。