DataNucleus / NeoDatis - соединение с БД закрывается, что приводит к потере персистентных объектов - PullRequest
1 голос
/ 14 ноября 2010

Использование DataNucleus У меня проблема, связанная с вторым оператором INFO ниже (2-я запись снизу).

При попытке прочитать или отредактировать объект после сохранения его с помощью makePersistent(), Я получаю только нулевые значения, журнал INFO указывает, что объект больше не управляется диспетчером постоянства (хотя я выполняю эти изменения сразу после вызова makePersistent()).

Я предполагаю, что соединение с моим хранилищем данных (NeoDatis в локальном встроенном / файловом режиме) закрыто , таким образом, диспетчер постоянства прекращает управлять им.Но я просто использую класс DataNucleus org.datanucleus.jdo.JDOPersistenceManagerFactory для создания соединения.

Есть идеи, почему это может произойти?Я на правильном пути, думая, что сообщения о закрытом соединении являются проблемой?

Сокращено полное доменное имя, а для краткости удалены посторонние журналы:

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

1 Ответ

1 голос
/ 15 ноября 2010

Я люблю изучать новые вещи, но почему это иногда должно быть таким болезненным процессом?Хорошо, верно, это ответ, а не вопрос ...

Итак, я удалил строку журнала ключей, которая помогла бы другим увидеть проблему:

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

Дело в том,что проблемы, описанные выше, были связаны с тем, что я выполнял действия вне транзакции.

На самом деле это был только первый шаг, в действительности я выполнял действия против другого * 1008.* чем была запущена транзакция.

У меня был Spring, управляющий транзакциями, но я звонил jdoPersistenceManager.getPersistenceManager(), что дало новый экземпляр PersistenceManager (подробный сеанс отладки раскрыл это).

Я должен был использовать пружину, чтобы получить PersistenceManager, который определил транзакция пружины.В конечном итоге это означало расширение JdoDaoSupport в моем объекте DAO.

Теперь я чувствую себя умнее, но каким-то образом обучение никогда не заканчивается.

...