【问题标题】:Hibernate Session Closed Exception after fast subsequent requests快速后续请求后的休眠会话关闭异常
【发布时间】:2011-11-07 13:10:44
【问题描述】:

当我在整个页面加载之前单击链接时收到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();
}

最终提交:

public void commit() {
    if (transaction != null)
        transaction.commit();
    transaction = null;
    session = null;
}

我错过了什么吗?

【问题讨论】:

    标签: hibernate session wicket


    【解决方案1】:

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

    其实你在getSession() 方法中的复杂逻辑是不需要的。当你在你的 DAO 中需要一个当前的 Session 时,你可以写 sessionFactory.getCurrentSession()。只要正确配置了 Hibernate(请参阅 2.3. Contextual sessions),它就会返回当前会话的正确实例,并且您的 DAO 将能够处理并发查询。

    【讨论】:

    • 非常感谢,它是线程不安全的。我更改了我的代码,从那时起我无法在疯狂单击所有链接时重现异常。顺便说一句,我从 DAO/POJO-creator 工具中获得了 getSession() 方法...
    猜你喜欢
    • 2014-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    相关资源
    最近更新 更多