Flaky Hibernate会话?

时间:2011-04-21 20:33:28

标签: web-services hibernate ehcache

Hibernate有时会抛出这个错误:org.hibernate.LazyInitializationException:无法初始化代理 - 没有Session。

现在:我知道,我知道 - 这意味着我正在操作的实体已经与会话分离,因此它无法初始化任何延迟加载的属性。但是,问题不是100%可重复的。它永远不会在新的部署中发生,因此我们通过重新启动受污染的服务器来解决问题(至少一段时间)。

我们确实启用了内存缓存,但我无法弄清楚缓存如何与延迟加载交互以导致此问题。此外,为什么我们永远不会在新服务器上看到这个问题,只在已经服用一段时间的服务器上?

1 个答案:

答案 0 :(得分:0)

当您使用旧的,陈旧的hibernate会话中的对象时,通常会抛出类似这样的LazyInitializationException。比如说,你有两个请求:

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

如果在请求1中未加载o.foo.bar,则抛出LazyInitializationException。您需要修复代码,以便Request 2获得一个新的会话,并带有该对象的新副本。追踪这类问题可能很棘手;检查请求之间保留的对象,当没有处理请求时(我发现jvisualvm或jprobe可以是一个福音)。通常问题的根源并不明显;例如,匿名类可以导致引用被保留。