【问题标题】:DataNucleus / NeoDatis - DB connection appears to close causing Persistable objects to be lostDataNucleus / NeoDatis - 数据库连接似乎关闭导致 Persistable 对象丢失
【发布时间】:2010-11-14 12:16:55
【问题描述】:

使用 DataNucleus 我在下面的第二个 INFO 语句中看到了一个问题(从底部开始的第二个条目)。

在使用 makePersistent() 持久化对象后尝试读取或编辑对象时,我只得到空值,INFO 日志表明 对象不再由持久性管理器管理(尽管我在makePersistent() 调用后立即执行这些编辑)。

我的猜测是与我的数据存储(本地嵌入/文件模式下的 NeoDatis)的连接正在关闭,因此持久性管理器停止管理它。但我只是使用 DataNucleus org.datanucleus.jdo.JDOPersistenceManagerFactory 类来创建连接。

知道为什么会发生这种情况吗?我是否认为关闭的连接消息是问题所在?

为简洁起见,删除了 FQDN 的缩短和无关日志:

DEBUG DataNucleus.Persistence  - Making object persistent : "a.b.c.User@22a866a9"
INFO  DataNucleus.Persistence  - Managing Persistence of Class : a.b.c.User [Table : (none), InheritanceStrategy : new-table]
DEBUG DataNucleus.Connection  - Connection added to the pool : [o.dn.s.neodatis.ConnectionFactoryImpl$ManagedConnectionImpl@28f337b, null] for key=o.dn.ExecutionContextImpl@59c12050 in factory=ConnectionFactory:tx[o.dn.s.neodatis.ConnectionFactoryImpl@3b626c6d]
DEBUG DataNucleus.Datastore  - Opening NeoDatis ODB for "neodatis:file:database/neodatis_primary_datastore.odb" : org.neodatis.odb.impl.main.LocalODB@13a183d2
DEBUG DataNucleus.Datastore.Persist  - Object "a.b.c.User@22a866a9" being inserted into NeoDatis with all reachable objects
DEBUG DataNucleus.Datastore.Persist  - Object "a.b.c.User@22a866a9" (id="15) persisted to NeoDatis
DEBUG DataNucleus.Datastore  - Committing NeoDatis ODB for "neodatis:file:database/neodatis_primary_datastore.odb" : org.neodatis.odb.impl.main.LocalODB@13a183d2
DEBUG DataNucleus.Connection  - Connection removed from the pool : [o.dn.s.neodatis.ConnectionFactoryImpl$ManagedConnectionImpl@28f337b, null] for key=o.dn.ExecutionContextImpl@59c12050 in factory=ConnectionFactory:tx[o.dn.s.neodatis.ConnectionFactoryImpl@3b626c6d]
DEBUG DataNucleus.Connection  - The connection has been closed : [o.dn.s.neodatis.ConnectionFactoryImpl$ManagedConnectionImpl@28f337b, null]
DEBUG DataNucleus.Reachability  - Performing check of objects for "persistence-by-reachability" (commit) ...
DEBUG DataNucleus.Cache  - Object "a.b.c.User@22a866a9" (id="15") added to Level 2 cache (loadedFlags="[YYYYYYY]", relationFields="null")
DEBUG DataNucleus.Transaction  - Committing [DataNucleus Transaction, ID=Xid=, enlisted resources=[]]
DEBUG DataNucleus.Lifecycle  - Object "a.b.c.User@22a866a9" (id="15") has a lifecycle change : "P_NEW"->"HOLLOW"
DEBUG DataNucleus.Transaction  - Object "a.b.c.User@22a866a9" (id="15") being evicted from transactional cache
DEBUG DataNucleus.Transaction  - Transaction committed in 7 ms
DEBUG DataNucleus.Lifecycle  - Object "a.b.c.User@22a866a9" (id="15") has a lifecycle change : "HOLLOW"->"P_NONTRANS"
DEBUG DataNucleus.Persistence  - Fetching object "a.b.c.User@22a866a9" (id=15) fields [authorities,createdFromIP,dateCreated,password,timeZoneID,username]
DEBUG DataNucleus.Datastore.Retrieve  - Object "a.b.c.User@22a866a9" (id="15") being retrieved from NeoDatis
DEBUG DataNucleus.Connection  - Connection added to the pool : [o.dn.s.neodatis.ConnectionFactoryImpl$ManagedConnectionImpl@39673d71, null] for key=o.dn.ExecutionContextImpl@59c12050 in factory=ConnectionFactory:tx[o.dn.s.neodatis.ConnectionFactoryImpl@3b626c6d]
DEBUG DataNucleus.Datastore  - Opening NeoDatis ODB for "neodatis:file:database/neodatis_primary_datastore.odb" : org.neodatis.odb.impl.main.LocalODB@621f6c18
DEBUG DataNucleus.Datastore  - Committing NeoDatis ODB for "neodatis:file:database/neodatis_primary_datastore.odb" : org.neodatis.odb.impl.main.LocalODB@621f6c18
DEBUG DataNucleus.Connection  - Connection removed from the pool : [o.dn.s.neodatis.ConnectionFactoryImpl$ManagedConnectionImpl@39673d71, null] for key=o.dn.ExecutionContextImpl@59c12050 in factory=ConnectionFactory:tx[o.dn.s.neodatis.ConnectionFactoryImpl@3b626c6d]
DEBUG DataNucleus.Connection  - The connection has been closed : [o.dn.s.neodatis.ConnectionFactoryImpl$ManagedConnectionImpl@39673d71, null]
INFO  DataNucleus.Persistence  - Request to populate fields of a.b.c.User@22a866a9 but this object is no longer managed by NeoDatis so replacing with a.b.c.User@7cf1cdfb
DEBUG DataNucleus.Datastore.Retrieve  - Execution Time = 5 ms

【问题讨论】:

    标签: java database database-connection jdo datanucleus


    【解决方案1】:

    我喜欢学习新事物,但为什么有时它必须是一个如此痛苦的过程? 好吧,这是一个答案,而不是一个问题......

    所以,我确实删除了一个可以帮助其他人看到问题的关键日志行:

    1795 [main] INFO DataNucleus.Transaction  - Non-tx updates are being committed to the datastore
    

    关键是上述问题是由于我在事务之外执行操作。

    实际上这只是第一步,真正发生的事情是我正在针对不同于事务开始的PersistenceManager 执行操作。

    我让 Spring 管理事务,但我调用了 jdoPersistenceManager.getPersistenceManager(),它产生了一个新的 PersistenceManager 实例(详细的调试会话发现了这一点)。

    我应该一直使用 spring 来获取 spring 事务定义的PersistenceManager。最终,这意味着在我的 DAO 对象中扩展 JdoDaoSupport

    我现在感觉自己更聪明了,但不知何故,学习永远不会结束。

    【讨论】:

    • 您能否进一步澄清一下,或者发布一些代码示例?
    • 您使用的是什么平台?我可以告诉你很多关于在 Spring 和 Data Nucleus 之外做这件事的事情,除了我的问题是通过正确打开和关闭事务来解决的。有很多事务管理器会为你启动和停止事务,或者你可能自己做(虽然我对直接在 DatanNucleus 中处理事务一无所知)。但最终的问题是我没有正确启动和停止交易。这一切都来自记忆,因为无论如何我走了一个完全不同的方向。
    • 谢谢,但没关系。我发现我的问题是,当 maven 构建和测试时,一切都很顺利,但是当 eclipse 构建时(据说在 Maven 的帮助下)它并不总是在编译时编织事务代码。
    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    相关资源
    最近更新 更多