开始时候报错
sf.hibernate.HibernateException: Could not initialize proxy - the owning Session was closed
后来在<many-to-one>里设置lazy="false". 但有可能会引发另一个异常叫
failed to lazily initialize a collection of role: XXXXXXXX, no session or session was closed
不过不是每次查询都会报错,大概30~40次查询会报错一次,在测试服务器上问题很不容易重现,在生产环境看log很容易发现问题。
我们的框架是struts1.2+hibernate3.1,没有使用spring,请问应该如何解决这个问题,谢谢。
sf.hibernate.HibernateException: Could not initialize proxy - the owning Session was closed
后来在<many-to-one>里设置lazy="false". 但有可能会引发另一个异常叫
failed to lazily initialize a collection of role: XXXXXXXX, no session or session was closed
不过不是每次查询都会报错,大概30~40次查询会报错一次,在测试服务器上问题很不容易重现,在生产环境看log很容易发现问题。
我们的框架是struts1.2+hibernate3.1,没有使用spring,请问应该如何解决这个问题,谢谢。
http://linweihan.javaeye.com/blog/145323
延迟加载就是用到的时候再加载,当你用到的时候也许你的session已经关闭了。
class Teacher
{
List studentList ;
}
这是一个一对多的关系。query()
{
Session session ...;
Teacher t = session.query();
session.close(); //到这步,t的studentList值还没加载,但是session关闭了
t.getStudentList(); // 加载,但session已经关闭
}
你的代码中应该有这样的地方。我觉得你说的3,40次就报一次错误,不是同一个地方。
一行代码要么可以执行,要么不可以执行,怎么会像六脉神剑一样,时灵时不灵呢?
如果你不在jsp调用延迟加载的数据,不会抛错的。如果在jsp中调用其中的一个延迟,但这个时候你的session已经被关闭了(应该是在 hibernate层就被关闭了)。所以
在jsp中肯定无法得到数据啦。抛出sessionClose异常。spring解决这个问题的方法是在filter层开启和关闭session。如果你不想改太多代码,只能把跑错的那个延迟加载取消了。