首页 文章

Flaky Hibernate会话?

提问于
浏览
2

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

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

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

1 回答

  • 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可以是一个福音) . 通常问题的根源并不明显;例如,匿名类可以导致引用被保持 .

相关问题