2010-11-14 5 views
1

L'utilisation de DataNucleus J'ai rencontré un problème dans la deuxième instruction INFO sous (2ème entrée à partir du bas).DataNucleus/NeoDatis - La connexion DB semble se fermer provoquant la perte des objets Persistable

Lorsque vous essayez de lire ou modifier un objet après persistant avec makePersistent(), je reçois juste des valeurs nulles, le journal INFO indique que l'objet n'est plus géré par le gestionnaire de persistance (bien que je l'exécution de ces modifications immédiatement après l'appel makePersistent()).

Je pense que la connexion à mon datastore (NeoDatis en mode intégré/fichier local) est en cours fermé, donc les arrêts de gestionnaire de persistance gérer. Mais j'utilise simplement la classe DataNucleus org.datanucleus.jdo.JDOPersistenceManagerFactory pour créer la connexion.

Une idée de ce qui pourrait arriver? Suis-je sur la bonne voie en pensant que les messages de connexion fermée sont le problème?

FQDN raccourcies, et les journaux étrangers enlevés par souci de concision:

DEBUG DataNucleus.Persistence - Making object persistent : "[email protected]" 
INFO DataNucleus.Persistence - Managing Persistence of Class : a.b.c.User [Table : (none), InheritanceStrategy : new-table] 
DEBUG DataNucleus.Connection - Connection added to the pool : [[email protected]37b, null] for [email protected] in factory=ConnectionFactory:tx[[email protected]] 
DEBUG DataNucleus.Datastore - Opening NeoDatis ODB for "neodatis:file:database/neodatis_primary_datastore.odb" : [email protected] 
DEBUG DataNucleus.Datastore.Persist - Object "[email protected]" being inserted into NeoDatis with all reachable objects 
DEBUG DataNucleus.Datastore.Persist - Object "[email protected]" (id="15) persisted to NeoDatis 
DEBUG DataNucleus.Datastore - Committing NeoDatis ODB for "neodatis:file:database/neodatis_primary_datastore.odb" : [email protected] 
DEBUG DataNucleus.Connection - Connection removed from the pool : [[email protected]37b, null] for [email protected] in factory=ConnectionFactory:tx[[email protected]] 
DEBUG DataNucleus.Connection - The connection has been closed : [[email protected]37b, null] 
DEBUG DataNucleus.Reachability - Performing check of objects for "persistence-by-reachability" (commit) ... 
DEBUG DataNucleus.Cache - Object "[email protected]" (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 "[email protected]" (id="15") has a lifecycle change : "P_NEW"->"HOLLOW" 
DEBUG DataNucleus.Transaction - Object "[email protected]" (id="15") being evicted from transactional cache 
DEBUG DataNucleus.Transaction - Transaction committed in 7 ms 
DEBUG DataNucleus.Lifecycle - Object "[email protected]" (id="15") has a lifecycle change : "HOLLOW"->"P_NONTRANS" 
DEBUG DataNucleus.Persistence - Fetching object "[email protected]" (id=15) fields [authorities,createdFromIP,dateCreated,password,timeZoneID,username] 
DEBUG DataNucleus.Datastore.Retrieve - Object "[email protected]" (id="15") being retrieved from NeoDatis 
DEBUG DataNucleus.Connection - Connection added to the pool : [[email protected]3d71, null] for [email protected] in factory=ConnectionFactory:tx[[email protected]] 
DEBUG DataNucleus.Datastore - Opening NeoDatis ODB for "neodatis:file:database/neodatis_primary_datastore.odb" : [email protected] 
DEBUG DataNucleus.Datastore - Committing NeoDatis ODB for "neodatis:file:database/neodatis_primary_datastore.odb" : [email protected] 
DEBUG DataNucleus.Connection - Connection removed from the pool : [[email protected]3d71, null] for [email protected] in factory=ConnectionFactory:tx[[email protected]] 
DEBUG DataNucleus.Connection - The connection has been closed : [[email protected]3d71, null] 
INFO DataNucleus.Persistence - Request to populate fields of [email protected] but this object is no longer managed by NeoDatis so replacing with [email protected] 
DEBUG DataNucleus.Datastore.Retrieve - Execution Time = 5 ms 

Répondre

1

J'aime apprendre de nouvelles choses, mais pourquoi doit-il être un processus douloureux parfois? droite Ok, ceci est une réponse, pas une question ...

Alors, je l'ai fait supprimer une ligne de journal clé qui aurait aidé d'autres personnes voir le problème:

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

Le point est que les problèmes ci-dessus étaient dus au fait que j'effectuais les actions en dehors d'une transaction.

En fait, ce n'était que la première étape, ce qui se passait vraiment, c'est que j'effectuais les actions sur un autre PersistenceManager que la transaction avait commencé.

J'avais des transactions Spring de gestion, mais j'appelais jdoPersistenceManager.getPersistenceManager(), ce qui donnait une nouvelle instance PersistenceManager (Une session de débogage détaillée a découvert ceci).

J'aurais dû utiliser spring pour obtenir le PersistenceManager que la transaction de printemps a défini. En fin de compte cela signifiait étendre JdoDaoSupport dans mon objet DAO. Je me sens plus malin maintenant, mais d'une manière ou d'une autre l'apprentissage ne s'arrête jamais.

+0

Pouvez-vous clarifier un peu plus loin, ou peut-être poster des échantillons de code? – Cojones

+0

Quelle plateforme utilisez-vous? Je peux vous dire beaucoup de choses à faire en dehors de Spring et de Data Nucleus, à part que mon problème a été résolu en ouvrant et fermant correctement les transactions. Il y a beaucoup de gestionnaires de transactions qui vont démarrer et arrêter des transactions pour vous, ou vous pouvez le faire vous-même (bien que je ne sache rien sur la gestion de transactinos dans DatanNucleus directement). Mais finalement le problème était que je ne commençais pas et arrêtais la transaction correctement. Tout cela vient de la mémoire car je suis allé dans une direction complètement différente après cela de toute façon. –

+0

Merci, mais peu importe. J'ai compris que mon problème était que quand maven construit et teste, tout va bien, mais quand Eclipse se construit (avec l'aide de Maven soi-disant), il ne tisse pas toujours dans le code transactionnel au moment de la compilation. – Cojones

Questions connexes