2014-03-25 24 views
3

所以我正在研究沒有多線程的應用程序。我們有一個主要的業務邏輯方法來打開休眠會話,如下所示:你能在java中每個線程只有一個hibernate會話嗎?

session = HibernateSessionFactory.getSession(); 
tx = session.beginTransaction(); 

然後執行一些輕的數據庫操作(幾個選擇)。然後調用一個我在子類中重寫的方法來執行另一個選擇。我無法將會話作爲參數傳遞,無需更新20個子類。

我試着打開一個新的會話和事務,並在完成後關閉它們,但是當我的方法被踢回到業務方法時,出現會話關閉的錯誤。我試着不關閉會話並提交事務,但那也不起作用。

現在我只是用這個,一切似乎正確本地工作:

session = HibernateSessionFactory.getSession(); 
tx = session.getTransaction(); 

,我只是關閉了會議,並回滾櫃面錯誤。我只是不確定getSession是否會始終返回已經打開的會話。我是否有權假定每個線程一次只能打開一個會話?

這裏的getSession執行:

Session session = (Session) threadLocal.get(); 

    if (session == null || !session.isOpen()) 
    { 
     if (sessionFactory == null) 
     { 
      rebuildSessionFactory(); 
     } 
     session = (sessionFactory != null) ? sessionFactory.openSession() : null; 
     threadLocal.set(session); 
    } 

    return session; 

謝謝!

+0

https://docs.jboss.org/hibernate/core/4.2/javadocs/org/hibernate/SessionFactory.html#getCurrentSession()將實現,並且您還需要配置https://docs.jboss.org /hibernate/core/4.2/javadocs/org/hibernate/context/spi/CurrentSessionContext.html,因爲'SessionFactory.html#getCurrentSession()'實際調用'CurrentSessionContext.currentSession()'方法來返回Session。通常'CurrentSessionContext.currentSession()'實現是每個線程一個Session。 – coderz

回答

2

從我的理解,getSession將返回一個新的休眠會話。有兩種在Hibernate中使用會話的方法,這些方法在文檔中描述爲事務模式:https://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch02.html

到數據庫的實際「會話」取決於您與數據庫的連接。大多數人使用連接池,如C3P0,可用於確保會話重用和加速代碼。

我使用的最佳結構是在應用程序啓動時創建一個SessionFactory,因爲這會將連接池設置爲數據庫。然後,利用可能的單例模式來保存一個SessionFactory,爲您從單個SessionFactory執行的每個事務請求新的會話。 Hibernate將利用底層連接池來處理會話重用以加速和優化。

相關問題