Hibernate会话在快速后续请求后关闭异常
我得到一个由以下原因引起的Hibernate会话在快速后续请求后关闭异常,hibernate,session,wicket,Hibernate,Session,Wicket,我得到一个由以下原因引起的:org.hibernate.SessionException:会话已关闭在加载整个页面之前单击链接时出错(或者我猜,就在活动的hibernate会话中) 我所有的DAO类都是子类化的GenericDAO,我从中得到了这个方法: public Session getSession() { if (session == null || !session.isOpen()) { session = HibernateUtil.getSessionFa
:org.hibernate.SessionException:会话已关闭代码>在加载整个页面之前单击链接时出错(或者我猜,就在活动的hibernate会话中)
我所有的DAO类都是子类化的GenericDAO
,我从中得到了这个方法:
public Session getSession() {
if (session == null || !session.isOpen()) {
session = HibernateUtil.getSessionFactory().getCurrentSession();
}
return session;
}
这称为:
public void beginTransaction() {
transaction = getSession().beginTransaction();
}
最后承诺:
public void commit() {
if (transaction != null)
transaction.commit();
transaction = null;
session = null;
}
我在这里遗漏了什么吗?看起来您对所有请求都使用了DAO的一个实例。但是,DAO试图在其字段中存储当前的会话
,因此无法处理并发请求。请注意,Session
不是线程安全的,您应该为不同的请求使用不同的Session
s
实际上,不需要使用getSession()
方法中的复杂逻辑。当您需要DAO中当前的会话时,只需编写sessionFactory.getCurrentSession()
。只要正确配置Hibernate(请参阅),它将返回当前会话的正确实例,并且DAO将能够提供并发查询。看起来所有请求都使用DAO的单个实例。但是,DAO试图在其字段中存储当前的会话
,因此无法处理并发请求。请注意,Session
不是线程安全的,您应该为不同的请求使用不同的Session
s
实际上,不需要使用getSession()
方法中的复杂逻辑。当您需要DAO中当前的会话时,只需编写sessionFactory.getCurrentSession()
。只要正确配置Hibernate(请参阅),它将返回当前会话的正确实例,并且您的DAO将能够提供并发查询。非常感谢,它是线程不安全的。我更改了代码,从那以后,我无法在疯狂地点击所有链接时重现异常。顺便说一句,我从DAO/POJO创建者工具中获得了getSession()-方法……非常感谢,它是线程不安全的。我更改了代码,从那以后,我无法在疯狂地点击所有链接时重现异常。顺便说一句,我从DAO/POJO创建者工具获得了getSession()方法。。。