2012-05-09 61 views
21

我理解數據庫事務概念的一般理解。我們訪問事務內的數據庫以確保ACID屬性。什麼是數據庫會話?

在Hibernate中有一個叫做會話的概念。會議有什麼用途?數據庫訪問何時應該在兩個會話中發生,而不是在同一會話中發生?

爲了解釋更多,我已經看到了Hibernate的代碼

  • 會從一個會話工廠
  • 會話打開一個會話
  • 開始交易
  • 提交事務
  • 關閉會議

我需要知道這裏會議的重要性是什麼?爲什麼不像事務工廠那樣,開始事務並提交事務?

+1

「數據庫訪問何時應該在兩個會話中發生,而不是在同一個會話中?」 https://developer.atlassian.com/display/CONFDEV/Hibernate+Sessions+and+Transaction+Management+Guidelines –

+0

僅供參考 - 有一個維基百科頁面:http://en.wikipedia.org/wiki/Session_(computer_science) –

回答

18

會話不僅僅是一個事務,它是一個實現UnitOfWork模式。換句話說,它支持加載的對象,知道哪些對象必須被持久化等:

工作單元跟蹤您在業務事務期間可能會影響數據庫的所有工作。完成後,它會根據您的工作計算出需要執行的任何操作來更改數據庫。

爲了更好地理解Session和Transaction之間的關係,你可以看看this article

單個Hibernate Session可能與單個數據庫事務具有相同的範圍。

這是用於會話每請求實現模式的最常用的編程模型。單個Session和單個數據庫事務實現特定請求事件(例如Web應用程序中的Http請求)的處理。千萬不要使用每個操作的會話反模式! (有極少數的例外時的session-per-操作可能是合適的,你不會遇到這些,如果你剛開始學習的Hibernate。)

另一種編程模型是長對話的是,如一個實現多步對話的應用程序,例如嚮導對話框,用於在多個請求/響應週期中與用戶進行交互。 實現這一點的一種方式是session-per-request-with-detached-objects模式。一旦持久對象在用戶思考期間被認爲是分離的,並且在修改之後必須重新附加到新的會話。

但是建議使用會話每會話模式。在這種情況下,單個Session的範圍比單個數據庫事務的範圍更大,並且可能跨越多個數據庫事務。每個請求事件都在單個數據庫事務中處理,但會話的刷新將延遲到對話結束和最後一次數據庫事務結束,以使對話成爲原子。會話在用戶思考期間保持斷開狀態,沒有開放的數據庫連接。 Hibernate的自動樂觀併發控制(使用版本控制)用於提供對話隔離。

5

@Dmitry已經很好地回答了。

查看會話的另一種方式是數據庫使用實例。創建會話時,您可以爲任何數據庫與其中所需的支持服務(例如事務,緩存,連接等)交互準備好上下文。交易是會話中使用的獨立服務。

此外,會話是典型的OR映射工具(如hibernate)使用的第一級緩存。會話充當根據請求創建的臨時上下文,以促進數據庫交互。