輕松理解Hibernate Session管理入門
本文就Hibernate Session的入門加以簡(jiǎn)單介紹。
Hibernate Session是Hibernate運(yùn)作的中心,對(duì)象的生命周期、事務(wù)的管理、數(shù)據(jù)庫的存取,都與 Session息息相關(guān),就如同在編寫JDBC時(shí)需關(guān)心Connection的管理,以有效的方法創(chuàng)建、利用與回收Connection,以減少資源的消耗,增加系統(tǒng)執(zhí)行效能一樣,有效的Session管理,也是Hibernate應(yīng)用時(shí)需關(guān)注的焦點(diǎn)。
Hibernate Session是由SessionFactory所創(chuàng)建,SessionFactory是執(zhí)行緒安全的(Thread-Safe),您可以讓多個(gè)執(zhí)行緒同時(shí)存取SessionFactory而不會(huì)有數(shù)據(jù)共享的問題,然而Session則不是設(shè)計(jì)為執(zhí)行緒安全的,所以試圖讓多個(gè)執(zhí)行緒共享一個(gè) Session,將會(huì)發(fā)生數(shù)據(jù)共享而發(fā)生混亂的問題。
在Hibernate參考手冊(cè)中的***章快速入門中,示范了一個(gè)HibernateUtil,它使用了ThreadLocal類別來建立一個(gè) Session管理的輔助類,這是Hibernate Session管理一個(gè)廣為應(yīng)用的解決方案,ThreadLocal是Thread- Specific Storage模式的一個(gè)運(yùn)作實(shí)例,您可以在下面這篇文章中了解Thread-Specific Storage模式:
designpattern:Thread-Specific Storage
由于Thread-Specific Stroage模式可以有效隔離執(zhí)行緒所使用的數(shù)據(jù),所以避開Session的多執(zhí)行緒之間的數(shù)據(jù)共享問題,以下列出Hibernate參考手冊(cè)中的HibernateUtil類:
- HibernateUtil.java
- import net.sf.hibernate.*;
- import net.sf.hibernate.cfg.*;
- public class HibernateUtil {
- private static Log log = LogFactory.getLog(HibernateUtil.class);
- private static final SessionFactory sessionFactory;
- static {
- try {
- // Create the SessionFactory
- sessionFactory = new Configuration().configure().buildSessionFactory();
- } catch (Throwable ex) {
- log.error("Initial SessionFactory creation failed.", ex);
- throw new ExceptionInInitializerError(ex);
- }
- }
- public static final ThreadLocal session = new ThreadLocal();
- public static Session currentSession() throws HibernateException {
- Session s = (Session) session.get();
- // Open a new Session, if this Thread has none yet
- if (s == null) {
- s = sessionFactory.openSession();
- session.set(s);
- }
- return s;
- }
- public static void closeSession() throws HibernateException {
- Session s = (Session) session.get();
- session.set(null);
- if (s != null)
- s.close();
- }
- }
在同一個(gè)執(zhí)行緒中,Session被暫存下來了,但無須擔(dān)心數(shù)據(jù)庫連結(jié)Connection持續(xù)占用問題,Hibernate會(huì)在真正需要數(shù)據(jù)庫操作時(shí)才(從連接池中)取得Connection。
在Web應(yīng)用程序中,我們可以藉助Filter來進(jìn)行Session管理,在需要的時(shí)候開啟Session,并在Request結(jié)束之后關(guān)閉Session,這個(gè)部份,在JavaWorld的Wiki上有個(gè)很好的例子:
http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=805
另外在Hibernate中文網(wǎng)上也有一篇介紹:
http://www.hibernate.org.cn/80.html
【編輯推薦】