Comment puis-je tirer des objets de mise en veille prolongée et en mémoire. Je suis frappé des problèmes de session

StackOverflow https://stackoverflow.com/questions/879309

Question

J'ai un projet assez énorme que je suis en train de rénover les données en mémoire. Essentiellement, j'ai une grande collection d'objets qui contiennent des primitives et d'autres objets qui existent dans Mise en veille prolongée. Les grandes sections de code non-dao reposent sur le chargement paresseux par mise en veille prolongée pour hydrater les objets à la volée. Cependant, puisque tout existe en mémoire, mon objet ne sont pas chargés, et je reçois des exceptions en veille prolongée de chargement paresseux.

Je pourrais implémenter des hibernate chargement paresseux par trempage pour hiberner et hydrater l'objet veille prolongée manuellement, mais le graphe d'objet pour cet objet est énorme, contenant des centaines de types qui auraient besoin d'être initialisé et définir. Cela semble peu pratique, et je suis à la recherche d'une solution viable à ce problème. Si quelqu'un a tout type de conseils, astuces, solutions, ou des histoires liées à ce genre de problèmes de problème ou similaires, je serais très reconnaissant.

Merci beaucoup.

Était-ce utile?

La solution

Si vous gérez les sessions à la main, essayez de passer ids objet (ID de ligne dans la base de données) au lieu des objets pleins. Ensuite, la préforme une base de données lorsque vous souhaitez lire pour obtenir l'objet ORM épanouie et ne garder l'objet ORM dans un champ limité, il pourrait être ordures collectées lorsque vous avez été fait avec elle. Ce serait probablement vous faire économiser de la mémoire.

Ceci a un effet secondaire de limiter également la quantité de temps dont vous avez besoin d'une séance ouverte. Comme vous pouvez ouvrir des sessions (je recommande une usine de session) et les fermer au besoin. Cependant, je pense qu'il peut y avoir un succès de base de données importante pour les sessions d'ouverture et de fermeture (je pense que la transaction sous-jacente est le problème réel). Vous pouvez regarder dans JPA, qui, autant que je sache, n'a pas besoin d'une opération pour les lectures. Le printemps a aussi quelques fonctionnalités intéressantes pour automatiser la transaction et la gestion de session, ils peuvent vouloir étudier.

Autres conseils

Vous avez probablement déjà fermé la session. Essayez de garder la session ouverte lorsque les données sont paresseux chargé ou si ce n'est pas possible, faire en spécifiant la charge désireux attribut lazy = « false » sur la collection (lazy = « true » est la valeur par défaut).

La cause la plus commune d'un LazyInitializationException est que la session de mise en veille prolongée est fermée. Gardez la session de mise en veille prolongée ouvert et vous devriez être bien.

S'il vous plaît noter que si vous utilisez le HibernateTemplate Spring 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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top