Hibernate 會話管理:openSession() 與getCurrentSession()
在JSP Web 應用程式中使用Hibernate 時,對會話管理的高效能管理數據存取。本文解決了有關 openSession() 和 getCurrentSession() 方法使用的常見問題。
1. Hibernate.current_session_context_class
hibernate.current_session_context_class 的值決定了 Hibernate 如何管理會話的生命週期。有兩個可能的選項:
-
線程: 此設定將會話綁定到當前線程,允許從執行緒執行中的任何位置存取會話。
-
jta:此設定使用 Java 事務 API (JTA) 來管理符合 JTA 的環境中的會話。
2.方法的選擇
是否使用openSession() 還是getCurrentSession() 取決於所採用的會話管理策略:
- 執行緒綁定會話(hibernate.current_session_context_class =thread):
使用 getCurrentSession() 存取綁定到目前執行緒的會話。這種方法適用於在單一請求或事務中開啟和關閉會話的情況。 -
非執行緒綁定會話 (hibernate.current_session_context_class=jta):
使用 openSession() 建立一個作業完成後必須明確關閉的新會話。
3.每個Web 應用程式會話與每個請求
不建議使用「每個Web 應用程式一個會話」方法,因為會話不是線程安全的,並且不能在多個線程之間共享。相反,更好的方法是:
-
每個請求一個會話:
為每個請求打開一個新會話,並在請求完成時關閉它。這樣可以確保不同請求存取的資料是隔離和安全的。
因此,建議在使用執行緒綁定會話時將hibernate.current_session_context_class 設定為「thread」並使用getCurrentSession(),或使用openSession() 並在使用非執行緒綁定會話時明確關閉會話。此外,建議採用「每個請求一個會話」的方法來確保資料完整性和線程安全。
以上是Hibernate 會話管理:什麼時候應該使用 openSession() 與 getCurrentSession()?的詳細內容。更多資訊請關注PHP中文網其他相關文章!