在整个页面加载之前单击链接时出现Caused by: org.hibernate.SessionException: Session is closed!
错误(或者我的猜测,就在活动的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;
}
我在这里错过了什么吗?
答案 0 :(得分:6)
看起来您为所有请求使用DAO的单个实例。但是,DAO会尝试将当前Session
存储在其字段中,因此无法处理并发请求。请注意,Session
不是线程安全的,您应该针对不同的请求使用不同的Session
。
实际上,不需要getSession()
方法中的复杂逻辑。当您需要DAO中的当前Session
时,您只需编写sessionFactory.getCurrentSession()
即可。只要正确配置了Hibernate(参见2.3. Contextual sessions),它就会返回当前会话的正确实例,并且您的DAO将能够提供并发查询。