2011-11-07 99 views
1

当我在加载整个页面(或我的猜测,只是在活动的休眠会话内)之前单击链接时,出现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; 
} 

上午我在这里丢失什么?

回答

6

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

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

+0

非常感谢,线程不安全。我改变了我的代码,从那时起,我无法在疯狂点击所有链接时重现异常。顺便说一下,我从DAO/POJO-creator工具中获得了getSession()方法... – rotsch