2011-04-21 3 views
2

Hibernate me renvoie parfois cette erreur: org.hibernate.LazyInitializationException: impossible d'initialiser le proxy - pas de session. Maintenant, je sais, je sais que cela signifie que l'entité sur laquelle je travaille s'est détachée de la session, donc il ne peut pas initialiser les propriétés qui sont paresseusement chargées. Cependant, le problème n'est pas reproductible à 100%. Cela n'arrive jamais sur de nouveaux déploiements, donc nous résolvons le problème (au moins pour un moment) en redémarrant les serveurs corrompus.Session Flaky Hibernate?

Nous avons un cache en mémoire activé, mais je ne peux pas comprendre comment la mise en cache pourrait interagir avec le chargement paresseux pour provoquer ce problème. En outre, pourquoi ne verrions-nous jamais ce problème sur de nouveaux serveurs, seulement sur des serveurs qui ont été ouverts pendant un moment?

+0

Le cache en mémoire est-il le cache d'hibernation ou quelque chose de différent comme une implémentation tierce? – brainimus

+0

c'est ehcache avec l'interface de mise en cache d'hibernate. – Denise

+0

Avez-vous trouvé une solution? J'ai le même problème que vous avez décrit –

Répondre

0

Une exception LazyInitializationException comme celle-ci est généralement générée lorsque vous utilisez un objet provenant d'une ancienne session de mise en veille prolongée périmée. Disons, par exemple, vous avez deux demandes:

Object o = null; 

Request 1: 
Session s1 = ...; 
o = s1.get(MyObject.class, myId); 
s1.close(); 

Request 2: 
o.getFoo().getBar(); //May throw a lazyinit exception 

Voici une LazyInitializationException sera levée si o.foo.bar n'a pas été chargé dans la demande 1. Vous devez corriger votre code afin que demande 2 reçoit une nouvelle session , avec une nouvelle copie de l'objet. Ce genre de problème peut être difficile à traquer; vérifier les objets que vous maintenez entre les demandes, lorsqu'aucune demande n'est en cours de traitement (j'ai trouvé que jvisualvm ou jprobe peut être un avantage). Souvent, la source du problème n'est pas évidente; les classes anonymes peuvent provoquer une référence, par exemple.

+0

La demande se produit dans une méthode de service Web, de sorte que nous ne conservons rien entre les demandes. Chaque demande doit être indépendante et identique. – Denise

+0

Je suppose qu'il est possible qu'il y ait un bug avec la mise en cache de second niveau; mais, je suppose que c'est votre application par inadvertance sur quelque chose (ou en fermant la session tôt), jusqu'à ce que vous pouvez prouver le contraire. À quoi ressemble la trace de la pile? – RMorrisey

+0

Oh, j'espère que c'est dans mon application quelque part! Cela signifierait que je pourrais le réparer ;-) – Denise