2009-05-18 8 views
0

J'ai un projet assez énorme dans lequel j'essaye de retrofit des données en mémoire. Essentiellement, j'ai une grande collection d'objets qui contiennent des primitives et d'autres objets qui existent dans Hibernate. De grandes sections de code non-dao s'appuient sur un chargement paresseux via hibernate pour hydrater des objets à la volée. Cependant, comme tout existe en mémoire, mes objets ne sont pas chargés, et j'obtiens des exceptions de chargement paresseuses en hibernation.Comment puis-je retirer des objets en mode hibernation et en mémoire. Je rencontre des problèmes de session

Je pourrais simplement implémenter manuellement le chargement paresseux d'hibernation en plongeant pour hiberner et hydrater l'objet en hibernation manuellement, mais le graphe d'objet pour cet objet est énorme, contenant des centaines de types qui devraient être initialisés et réglés. Cela semble peu pratique et je cherche une solution viable à ce problème. Si quelqu'un a des conseils, des astuces, des solutions ou des histoires concernant ce genre de problème ou des problèmes similaires, je serais très reconnaissant.

Merci beaucoup.

Répondre

1

Si vous manipulez les sessions à la main, essayez de transmettre les ID d'objet (identifiants de lignes dans la base de données) plutôt que les objets complets. Préformez ensuite une base de données lue lorsque vous souhaitez obtenir l'objet ORM complet et ne conservez que l'objet ORM dans une portée limitée afin qu'il puisse être collecté lorsque vous en avez fini avec. Cela vous épargnerait probablement de la mémoire.

Ceci a pour effet secondaire de limiter également la durée d'une session ouverte. Comme vous pourriez ouvrir des sessions (je recommanderais une usine de session) et les fermer si nécessaire. Cependant, je pense qu'il pourrait y avoir un gros problème de base de données pour les sessions d'ouverture et de clôture (je pense que la transaction sous-jacente est le vrai problème). Vous voudrez peut-être regarder dans JPA, qui, autant que je comprends, n'a pas besoin d'une transaction pour les lectures. Spring a également quelques fonctionnalités intéressantes pour automatiser la gestion des transactions et des sessions qu'ils souhaitent étudier.

0

Vous avez probablement déjà fermé la session. Essayez de garder la session ouverte lorsque les données sont chargées paresseusement ou, si cela n'est pas possible, faites un chargement rapide en spécifiant l'attribut lazy = "false" sur la collection (lazy = "true" est la valeur par défaut).

0

La cause la plus fréquente d'un LazyInitializationException est que la session de mise en veille prolongée est fermée. Gardez la session d'hibernation ouverte et vous devriez aller bien.

Veuillez noter que si vous utilisez le ressort HibernateTemplate pour charger des objets, les objets que vous chargez seront nécessairement détachés. Si vous construisez une webapp en utilisant Spring MVC, un moyen facile de contourner cela est d'utiliser le OpenSessionInViewInterceptor.

Questions connexes