快速后续请求后,Hibernate Session Closed Exception

时间:2011-11-07 13:10:45

标签: hibernate session wicket

在整个页面加载之前单击链接时出现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;
}

我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:6)

看起来您为所有请求使用DAO的单个实例。但是,DAO会尝试将当前Session存储在其字段中,因此无法处理并发请求。请注意,Session不是线程安全的,您应该针对不同的请求使用不同的Session

实际上,不需要getSession()方法中的复杂逻辑。当您需要DAO中的当前Session时,您只需编写sessionFactory.getCurrentSession()即可。只要正确配置了Hibernate(参见2.3. Contextual sessions),它就会返回当前会话的正确实例,并且您的DAO将能够提供并发查询。