2011-11-07 96 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