快速后续请求后休眠会话关闭异常
问题描述:
当我在加载整个页面(或我的猜测,只是在活动的休眠会话内)之前单击链接时,出现Caused by: org.hibernate.SessionException: Session is closed!
错误。快速后续请求后休眠会话关闭异常
我所有的DAO类都继承GenericDAO
那里我得到了这种方法:
public Session getSession() {
if (session == null || !session.isOpen()) {
session = HibernateUtil.getSessionFactory().getCurrentSession();
}
return session;
}
这是从所谓:
public void beginTransaction() {
transaction = getSession().beginTransaction();
}
终于COMMITED:
public void commit() {
if (transaction != null)
transaction.commit();
transaction = null;
session = null;
}
上午我在这里丢失什么?
答
它看起来就像您对所有请求使用您的DAO的单个实例。但是,您的DAO会尝试将当前的Session
存储在其字段中,因此它无法处理并发请求。请注意,Session
不是线程安全的,您应该针对不同的请求使用不同的Session
。
实际上,您在getSession()
方法中的复杂逻辑是不需要的。当您需要在DAO中使用当前的Session
时,您只需编写sessionFactory.getCurrentSession()
。只要Hibernate配置正确(请参阅2.3. Contextual sessions),它将返回当前会话的正确实例,并且您的DAO将能够提供并发查询。
非常感谢,线程不安全。我改变了我的代码,从那时起,我无法在疯狂点击所有链接时重现异常。顺便说一下,我从DAO/POJO-creator工具中获得了getSession()方法... – rotsch