2010-03-29 37 views
13

想知道在Hibernate中開始一個新的事務是否實際分配了一個連接到數據庫?Hibernate中的beginTransaction是否分配新的數據庫連接?

我擔心b/c我們的服務器爲每個收到的請求開始一個新的事務,即使這個請求沒有與數據庫交互。我們將數據庫連接視爲主要瓶頸,所以我想知道是否應該縮短我的交易範圍。

到處搜索,一直沒有找到一個很好的答案。非常簡單的代碼在這裏:

SessionFactory sessionFactory = (SessionFactory) Context.getContext().getBean("sessionFactory"); 
    sessionFactory.getCurrentSession().beginTransaction(); 
    sessionFactory.getCurrentSession().setFlushMode(FlushMode.AUTO); 

非常感謝! 一個

回答

8

(每帕斯卡Thivent的評論更新)

每個Session創建一個數據庫連接,如果有需要一種 - 例如如果交易開始。僅通過創建會話就無法打開連接。

爲了解決這個問題,您可以使用connecetion pool,以便重新使用連接。或者你可以確保(看起來你是)沒有自動開始交易。

This討論只讀事務看一看。)

+0

謝謝,我們正在使用連接池。通過默認情況下不開始交易,我們能夠大量減少數據庫的負載。 – illscience 2010-03-31 14:33:51

+1

實際上,連接在'Session'中被延遲加載。詳情請參閱我的回答。 – 2010-03-31 15:41:57

+0

@帕斯卡爾Thivent HM,有趣,邏輯:) @illscience請改變接受的答案 – Bozho 2010-03-31 17:15:34

14

按照Hibernate文檔的部分11.1. Session and transaction scopes

一個SessionFactory是 昂貴到創建,線程 對象,旨在由所有應用程序線程共享。它創建了 一次,通常在應用程序啓動時,從Configuration實例開始 。

Session一個是應 使用一次然後被丟棄的廉價, 非線程對象:一個 單個請求,一個會話或一個工作 單個單元。 A Session將 未獲得JDBC ConnectionDatasource,除非需要。它 將不會消耗任何資源,直到 使用。

爲了減少 數據庫中的鎖爭用,數據庫事務 必須儘可能短。長 數據庫事務將阻止您的應用程序的 擴展爲 高併發負載。這不是 建議您持有數據庫 交易在用戶認爲 時間打開,直到工作單元是 完成。現在

,回答你的問題:

  • 得到一個Session立即獲取一個連接(連接延遲加載)
  • 但調用beginTransaction()會導致連接的負載對於給定的Session
  • 後續調用將重用相同connection

org.hibernate.impl.SessionImpl#beginTransaction()並通過代碼獲取更多詳細信息。

+0

+1,當然(15chrs) – Bozho 2010-03-31 17:19:18

+0

@Bozho謝謝! – 2010-03-31 18:27:01

+0

THANKs。很好的答案 – 2013-01-17 04:25:36

相關問題