這篇文章主要介紹“Hibernate Session管理怎么理解”,在日常操作中,相信很多人在Hibernate Session管理怎么理解問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Hibernate Session管理怎么理解”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
專注于為中小企業(yè)提供做網(wǎng)站、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)舞鋼免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了超過(guò)千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
Hibernate Session是Hibernate運(yùn)作的中心,對(duì)象的生命周期、事務(wù)的管理、數(shù)據(jù)庫(kù)的存取,都與 Session息息相關(guān),就如同在編寫(xiě)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ù)共享的問(wèn)題,然而Session則不是設(shè)計(jì)為執(zhí)行緒安全的,所以試圖讓多個(gè)執(zhí)行緒共享一個(gè) Session,將會(huì)發(fā)生數(shù)據(jù)共享而發(fā)生混亂的問(wèn)題。
在Hibernate參考手冊(cè)中的***章快速入門中,示范了一個(gè)HibernateUtil,它使用了ThreadLocal類別來(lái)建立一個(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ù),所以避開(kāi)Session的多執(zhí)行緒之間的數(shù)據(jù)共享問(wèn)題,以下列出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被暫存下來(lái)了,但無(wú)須擔(dān)心數(shù)據(jù)庫(kù)連結(jié)Connection持續(xù)占用問(wèn)題,Hibernate會(huì)在真正需要數(shù)據(jù)庫(kù)操作時(shí)才(從連接池中)取得Connection。
到此,關(guān)于“Hibernate Session管理怎么理解”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!