|
Session是Hibernate運作的中心,物件的生命週期、事務的管理、資料庫的存取,都與Session息息相關,就如同在編寫JDBC時需關心
Connection的管理,以有效的方法創建、利用與回收Connection,以減少資源的消耗,增加系統執行效能一樣,有效的Session管理,
也是Hibernate應用時需關注的焦點。 Session是由SessionFactory所創建,SessionFactory是執行緒安全的(Thread-safe),您可以讓多個執行緒同 時存取SessionFactory而不會有資料共用的問題,然而Session則不是設計為執行緒安全的,所以試圖讓多個執行緒共用一個 Session,將會發生資料共用而發生混亂的問題。 在Hibernate參考手冊中的 Quickstart with Tomcat 中,示範了一個HibernateUtil,它使用了ThreadLocal類別來建立一個Session管理的輔助類,這是Hibernate的 Session管理一個廣為應用的解決方案,ThreadLocal是 Thread-Specific Storage 模式 的一個運作實例。 由於Thread-Specific Stroage模式可以有效隔離執行緒所使用的資料,所以避開Session的多執行緒之間的資料共用問題,以下列出Hibernate參考手冊中的 HibernateUtil類,事實上它就是 第 一個 Hibernate 中所使用的 HibernateUtil:
import org.apache.commons.logging.Log; 在同一個執行緒中,Session被暫存下來了,但無須擔心資料庫連結Connection持續占用問題,Hibernate會在真正需要資料庫操作時才 (從連接池中)取得Connection。 在程式中可以這麼使用HibernateUtil: Session
session = HibernateUtil.currentSession();
User user = (User) session.load(User.class, new Integer(1)); System.out.println(user.getName()); HibernateUtil.closeSession(); 在Web應用程式中,可以藉助Filter來進行Session管理,在需要的時候開啟Session,並在Request結束之後關閉Session, 這個部份,在 JavaWorld 技術論壇 的 Wiki 上有篇 在filter 中關閉session 可以參考。 |