• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      Hibernate對(duì)象管理研究

      2015-01-06 05:18:33王琦袁鵬博陳義明
      電腦知識(shí)與技術(shù) 2014年34期
      關(guān)鍵詞:游離語句生命周期

      王琦+袁鵬博+陳義明

      摘要:該文分析了Hibernate框架在應(yīng)用程序持久層的位置、原理和重要意義。深入研究了Hibernate對(duì)象生命周期中的三種狀態(tài)及其轉(zhuǎn)化關(guān)系,并用實(shí)際開發(fā)中的典型程序段進(jìn)行了直觀形象地說明。闡明了Hibernate的Session緩存對(duì)數(shù)據(jù)持久性能的優(yōu)化機(jī)制[1]。對(duì)準(zhǔn)確、高效地操作Hibernate對(duì)象,編寫高質(zhì)量的持久層應(yīng)用程序具有重要的參考價(jià)值。

      關(guān)鍵詞:Hibernate實(shí)體對(duì)象;生命周期;Session緩存;ORM

      中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)34-8165-02

      Java是一種純粹的面向?qū)ο笳Z言,適合于對(duì)現(xiàn)實(shí)世界的行為進(jìn)行建模。JavaEE(Java Enterprise Edition)是Sun公司(現(xiàn)已被Oracle公司收購(gòu))提出的企業(yè)級(jí)分布式應(yīng)用開發(fā)規(guī)范。因其開放性,有大量?jī)?yōu)秀的第三方軟件公司提供組件支持而受到軟件開發(fā)者的普遍推崇。

      目前,大量的信息系統(tǒng)使用的都是關(guān)系型數(shù)據(jù)庫,即以二維表的形式存儲(chǔ)數(shù)據(jù),應(yīng)用系統(tǒng)將處理的數(shù)據(jù)長(zhǎng)久地存儲(chǔ)到數(shù)據(jù)庫的過程叫做持久化。由于JavaEE系統(tǒng)操作的都是對(duì)象,持久化過程需要將對(duì)象轉(zhuǎn)成關(guān)系表存儲(chǔ)。反過來,應(yīng)用系統(tǒng)操縱關(guān)系表中的數(shù)據(jù)時(shí),需要將取出來的數(shù)據(jù)封裝為java能夠操作的對(duì)象。上述正反過程叫做ORM(Object-Relationship Mapping,對(duì)象關(guān)系映射)。為了避免重復(fù)書寫ORM代碼,給系統(tǒng)維護(hù)帶來不便,同時(shí)也為了提高軟件開發(fā)效率及質(zhì)量,一些優(yōu)秀的ORM映射框架脫穎而出,Hibernate就是一款優(yōu)秀的ORM映射框架[1-2]。

      1 Hibernate框架及ORM

      Hibernate是JDBC(Java Database Connection,java數(shù)據(jù)庫連接)輕量級(jí)的對(duì)象封裝,是一個(gè)獨(dú)立的對(duì)象持久層框架。具有如下顯著優(yōu)勢(shì):

      1) 應(yīng)用程序在訪問數(shù)據(jù)庫時(shí),Hibernate簡(jiǎn)化了數(shù)據(jù)訪問層代碼,并且對(duì)這些代碼進(jìn)行了封裝;

      2) Hibernate是輕量級(jí)框架,很靈活、性能非常好,支持多種數(shù)據(jù)庫平臺(tái);

      3) 具有相對(duì)的獨(dú)立性,如果底層數(shù)據(jù)庫發(fā)生改變,修改持久層配置文件即可。只要提供的API(Application Programming Interface)不變,則上層的業(yè)務(wù)邏輯層不用修改[3];

      Hibernate框架有兩個(gè)重要功能:

      1) 對(duì)象關(guān)系映射ORM

      通常來說,一個(gè)持久化類對(duì)應(yīng)數(shù)據(jù)庫的一張表,類的每個(gè)實(shí)例對(duì)應(yīng)表中的一條記錄,對(duì)象的屬性對(duì)應(yīng)表的一個(gè)字段,關(guān)系數(shù)據(jù)表之間的關(guān)系體現(xiàn)為對(duì)象之間的關(guān)聯(lián)關(guān)系。面向?qū)ο蠛兔嫦蜿P(guān)系概念之間的對(duì)應(yīng)關(guān)系如表1所示[4]:

      2) 對(duì)象管理

      ORM(對(duì)象關(guān)系映射)在關(guān)系型數(shù)據(jù)庫中的表和應(yīng)用程序中對(duì)象之間作一個(gè)自動(dòng)的映射關(guān)聯(lián)會(huì)起到很大的作用,而在實(shí)際操作數(shù)據(jù)庫時(shí),只須通過HQL(Hibernate Query Language對(duì)象操作語言)直接操縱對(duì)象即可。Hibernate框架負(fù)責(zé)管理對(duì)象,其中的ORM工具會(huì)自動(dòng)將對(duì)象的操作轉(zhuǎn)換為SQL語句操作并進(jìn)行事務(wù)管理。

      2 Hibernate實(shí)體對(duì)象生命周期及狀態(tài)轉(zhuǎn)化[3]

      2.1 實(shí)體對(duì)象生命周期[3]

      在java語言中,當(dāng)用new關(guān)鍵詞開辟內(nèi)存空間創(chuàng)建一個(gè)Java對(duì)象(以Customer對(duì)象為例)時(shí),這個(gè)Java對(duì)象就開始進(jìn)入其生命周期。如果沒有變量對(duì)該對(duì)象進(jìn)行引用,就結(jié)束其生命周期,而其所占用的內(nèi)存就會(huì)被JVM的垃圾回收器回收。

      應(yīng)用Hibernate框架進(jìn)行持久管理,支持下列三種對(duì)象狀態(tài):

      1) 臨時(shí)狀態(tài)(Transient):當(dāng)用new語句創(chuàng)建臨時(shí)的一個(gè)對(duì)象,這個(gè)對(duì)象就占用了內(nèi)存;但此時(shí)該對(duì)象在數(shù)據(jù)庫中還沒有對(duì)應(yīng)記錄,沒有給對(duì)象分配持久化標(biāo)識(shí)符或是還沒有被持久化,與Hibernate的Session毫無關(guān)系。Java對(duì)象處于臨時(shí)狀態(tài)就稱為臨時(shí)對(duì)象[4-6]。

      2) 持久化狀態(tài)(Persistent):臨時(shí)對(duì)象或是游離狀態(tài)通過調(diào)用session的相應(yīng)方法轉(zhuǎn)化為持久化對(duì)象,此時(shí)已被分配到一個(gè)持久化標(biāo)識(shí)符,在數(shù)據(jù)庫中已有了相關(guān)記錄;同時(shí)被加載到Session緩存中,與Session的實(shí)例關(guān)聯(lián),服從Session的統(tǒng)一調(diào)度。Java對(duì)象處于持久化狀態(tài)下就稱為持久化對(duì)象[4-6]。

      3) 游離(脫管)狀態(tài)(Detached):該狀態(tài)下的對(duì)象已經(jīng)被持久化過,是由持久化對(duì)象轉(zhuǎn)化而來。即使不在session緩存中,但還會(huì)被分配一個(gè)持久化標(biāo)志符,也就是在數(shù)據(jù)庫中還有相對(duì)應(yīng)的數(shù)據(jù),這是不同于臨時(shí)對(duì)象的。當(dāng)相關(guān)Session被關(guān)閉后,調(diào)用相應(yīng)的Session方法,但還是能夠重新進(jìn)入到一個(gè)新的會(huì)話緩存中。Java對(duì)象處于游離狀態(tài)就稱為游離對(duì)象[4-6]。

      Hibernate實(shí)體對(duì)象三種狀態(tài)的特征如表2所示。

      2.2 Session接口與狀態(tài)轉(zhuǎn)化

      Session作為Hibernate的第一級(jí)緩存,是Hibernate向應(yīng)用程序提供對(duì)象操作的主要接口,它的特定方法能使對(duì)象從一個(gè)狀態(tài)轉(zhuǎn)化到另一個(gè)狀態(tài)。Hibernate生命周期的各狀態(tài)及他們之間的轉(zhuǎn)換如圖1所示。

      圖1顯示:對(duì)象的臨時(shí)狀態(tài)經(jīng)Session的save()方法或saveOrUpdate()轉(zhuǎn)變?yōu)槌志脿顟B(tài);持久狀態(tài)經(jīng)Session的close()、evict()、clear()方法轉(zhuǎn)變?yōu)橛坞x狀態(tài);游離狀態(tài)或者持久狀態(tài)轉(zhuǎn)變?yōu)榕R時(shí)狀態(tài)都是進(jìn)行Session的delete()操作;臨時(shí)狀態(tài)或游離狀態(tài)下的Java對(duì)象,沒有其他變量引用它,或者沒有與Session緩存關(guān)聯(lián),JVM的垃圾回收器就會(huì)回收java對(duì)象所占用的內(nèi)存,隨之它的生命周期徹底結(jié)束;若對(duì)象處于持久化狀態(tài)中,在數(shù)據(jù)庫中有對(duì)應(yīng)記錄,始終被分配一個(gè)持久化標(biāo)志,Session緩存會(huì)引用它,始終占據(jù)著內(nèi)存,如果不進(jìn)行delete操作,它就始終處于生命周期中。endprint

      圖2中的代碼段顯示了對(duì)象Customer生命周期的三種狀態(tài)及其轉(zhuǎn)化。在語句(1)中實(shí)例化的customer對(duì)象沒有與數(shù)據(jù)庫中的記錄關(guān)聯(lián),并且沒有被Session緩存管理,因此屬于臨時(shí)對(duì)象。語句(2)打開一個(gè)會(huì)話,獲取數(shù)據(jù)庫連接,直到語句(5)關(guān)閉會(huì)話,將數(shù)據(jù)庫連接歸還到連接池,其中的對(duì)象受到Session緩存的管理。語句(3)開始一個(gè)數(shù)據(jù)庫事務(wù),直到語句(5)提交結(jié)束該事務(wù),語句(3)和(5)之間是數(shù)據(jù)庫的操作,通過語句(5)的事務(wù)提交使Session緩存對(duì)象持久化,和數(shù)據(jù)庫保持一致。因此,可以判斷語句(6)中的對(duì)象c是持久化對(duì)象。語句(8)中的對(duì)象在數(shù)據(jù)庫中有對(duì)應(yīng)的記錄,但脫離了Session緩存的管理,屬于游離對(duì)象,如果沒有其他對(duì)象引用,將被java垃圾回收器回收[4]。

      3 Hibernate對(duì)象持久優(yōu)化[6]

      Hibernate的Session具有一個(gè)由一些集合屬性構(gòu)成的緩存,持久對(duì)象的引用保存在集合中,在這些集合中的對(duì)象和數(shù)據(jù)庫中的相關(guān)記錄始終保持著對(duì)應(yīng),始終使這些Session中的持久化對(duì)象永遠(yuǎn)處于生命周期。Session在某些具體的時(shí)間點(diǎn),按照緩存中持久化對(duì)象的屬性和狀態(tài)變化更新數(shù)據(jù)庫,并且與關(guān)系數(shù)據(jù)庫的記錄保持一致的過程稱為清理緩存[5]。

      3.1 Session緩存的意義[5]

      Session緩存對(duì)于數(shù)據(jù)持久具有十分重要的意義:

      1) 降低數(shù)據(jù)庫訪問頻率,優(yōu)化數(shù)據(jù)庫訪問性能:從內(nèi)存中讀取對(duì)象,節(jié)省了訪問數(shù)據(jù)庫步驟和時(shí)間,從而提高程序運(yùn)行效率。

      2) 如果會(huì)話緩存中的持久化對(duì)象之間是相互循環(huán)關(guān)聯(lián)的,Session緩存會(huì)杜絕出現(xiàn)程序訪問對(duì)象圖時(shí)出現(xiàn)死循環(huán)的現(xiàn)象,和由產(chǎn)生的死循環(huán)而引發(fā)的異常狀況,比如內(nèi)存泄露,堆棧溢出。

      3) 實(shí)現(xiàn)Session緩存中的持久化對(duì)象與關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)保持一致。如果Session緩存中持久化對(duì)象的狀態(tài)改變時(shí),有可能變?yōu)榕R時(shí)對(duì)象或者游離對(duì)象,但在Session緩存中會(huì)按照相應(yīng)的順序調(diào)用session的方法,或者將多條相關(guān)的SQL語句合成,程序運(yùn)行的效率提高,而數(shù)據(jù)庫的訪問減少,系統(tǒng)性能實(shí)現(xiàn)優(yōu)化。

      3.2 Session緩存清理行為

      Hibernate的Session清理緩存是根據(jù)緩存中對(duì)象的狀態(tài)變化,按特定順序執(zhí)行相關(guān)的SQL語句來同步更新數(shù)據(jù)庫的。

      1) 一開始程序會(huì)調(diào)用session.save()方法,將臨時(shí)對(duì)象持久化,讓對(duì)象變?yōu)槌志没瘜?duì)象;

      2) 再執(zhí)行insert語句,插入所有的實(shí)體對(duì)象,剛插入進(jìn)來的實(shí)體對(duì)象服從Session的調(diào)度管理;

      3) 然后執(zhí)行update語句,對(duì)所有實(shí)體對(duì)象進(jìn)行更新操作;

      4) 接著執(zhí)行delete語句,對(duì)所有集合(List、Map、Set)進(jìn)行刪除操作;

      5) 同樣是插入、更新、刪除的SQL語句,再對(duì)所有集合(List、Map、Set)里的元素進(jìn)行對(duì)應(yīng)操作;

      6) 還是執(zhí)行insert插入操作,這次是對(duì)所有集合(List、Map、Set)進(jìn)行插入;

      7) 最后一步調(diào)用session.delete()的方法,刪除所有實(shí)體對(duì)象,清空緩存,騰出內(nèi)存。以上為完整的Session清理緩存的過程,將緩存里的持久化對(duì)象轉(zhuǎn)化為臨時(shí)對(duì)象,再用JVM的垃圾回收器將不在占用內(nèi)存的臨時(shí)對(duì)象回收。

      3.3 Session緩存清理時(shí)間點(diǎn)[6]

      在Session緩存中用setFlushMode()方法來設(shè)置清理緩存的時(shí)間點(diǎn)。FlushMode類定義了三種不同的清理模式:FlushMode.AUTO、FlushMode.COMMIT、FlushMode.NEVER。

      如果選用FulshMode.AUTO模式,在這種模式下session.find(),session.iterate(),transaction.commit(),session.flush()等Session的多種方法和事務(wù)管理都能執(zhí)行清理緩存行為。

      如果選用FlushMode.COMMIT模式,在這種模式下的session.flush(),transaction.commit()都能執(zhí)行清理緩存;

      如果選用FulshMode.NEVER模式,在這種模式下transaction.commit()不能清理緩存,session.find()也不清理緩存,就只能通過session.flush()來清理。

      無論設(shè)置在哪種FlushMode清理模式,session.flush()都將會(huì)去清理緩存,從上述可知優(yōu)先考慮使用FlusthMode.AUTO,很方便地?zé)o須手動(dòng)執(zhí)行session.flush()。

      4 總結(jié)

      Hibernate是一種輕量級(jí)的數(shù)據(jù)持久層框架,使用它能夠高效、高質(zhì)量地開發(fā)出JavaEE應(yīng)用程序。論文對(duì)Hibernate對(duì)象管理機(jī)制進(jìn)行了深入的研究和探討,對(duì)準(zhǔn)確、高效地開發(fā)持久層應(yīng)用程序具有重要的意義。

      參考文獻(xiàn):

      [1] Gavin King,Christian Bauer,Max Rydahl Andersen,et,al.Hibernate Reference Documentation

      [2] 李剛.輕量級(jí)Java EE企業(yè)應(yīng)用實(shí)戰(zhàn):Struts 2+Spring 4+Hibernate整合開發(fā)[M]. 4版.北京:電子工業(yè)出版社,2014.

      [3] 鮑爾,金著.Hibernate實(shí)戰(zhàn)[M].2版·英文版.北京:人民郵電出版社,2009.

      [4] 孫衛(wèi)琴.精通Hibernate:Java對(duì)象持久化技術(shù)詳解[M].2版.北京:電子工業(yè)出版社,2010.

      [5] 樹頭孤鳥.妙解Hibernate.3.X-叩響面向?qū)ο笏枷胫T[M].北京:電子工業(yè)出版社,2010.

      [6] Christian Bauer,Gavin King.Hibernate實(shí)戰(zhàn)[M]. 楊春花,譯.2版·中文版.北京:人民郵電出版社,2008.endprint

      圖2中的代碼段顯示了對(duì)象Customer生命周期的三種狀態(tài)及其轉(zhuǎn)化。在語句(1)中實(shí)例化的customer對(duì)象沒有與數(shù)據(jù)庫中的記錄關(guān)聯(lián),并且沒有被Session緩存管理,因此屬于臨時(shí)對(duì)象。語句(2)打開一個(gè)會(huì)話,獲取數(shù)據(jù)庫連接,直到語句(5)關(guān)閉會(huì)話,將數(shù)據(jù)庫連接歸還到連接池,其中的對(duì)象受到Session緩存的管理。語句(3)開始一個(gè)數(shù)據(jù)庫事務(wù),直到語句(5)提交結(jié)束該事務(wù),語句(3)和(5)之間是數(shù)據(jù)庫的操作,通過語句(5)的事務(wù)提交使Session緩存對(duì)象持久化,和數(shù)據(jù)庫保持一致。因此,可以判斷語句(6)中的對(duì)象c是持久化對(duì)象。語句(8)中的對(duì)象在數(shù)據(jù)庫中有對(duì)應(yīng)的記錄,但脫離了Session緩存的管理,屬于游離對(duì)象,如果沒有其他對(duì)象引用,將被java垃圾回收器回收[4]。

      3 Hibernate對(duì)象持久優(yōu)化[6]

      Hibernate的Session具有一個(gè)由一些集合屬性構(gòu)成的緩存,持久對(duì)象的引用保存在集合中,在這些集合中的對(duì)象和數(shù)據(jù)庫中的相關(guān)記錄始終保持著對(duì)應(yīng),始終使這些Session中的持久化對(duì)象永遠(yuǎn)處于生命周期。Session在某些具體的時(shí)間點(diǎn),按照緩存中持久化對(duì)象的屬性和狀態(tài)變化更新數(shù)據(jù)庫,并且與關(guān)系數(shù)據(jù)庫的記錄保持一致的過程稱為清理緩存[5]。

      3.1 Session緩存的意義[5]

      Session緩存對(duì)于數(shù)據(jù)持久具有十分重要的意義:

      1) 降低數(shù)據(jù)庫訪問頻率,優(yōu)化數(shù)據(jù)庫訪問性能:從內(nèi)存中讀取對(duì)象,節(jié)省了訪問數(shù)據(jù)庫步驟和時(shí)間,從而提高程序運(yùn)行效率。

      2) 如果會(huì)話緩存中的持久化對(duì)象之間是相互循環(huán)關(guān)聯(lián)的,Session緩存會(huì)杜絕出現(xiàn)程序訪問對(duì)象圖時(shí)出現(xiàn)死循環(huán)的現(xiàn)象,和由產(chǎn)生的死循環(huán)而引發(fā)的異常狀況,比如內(nèi)存泄露,堆棧溢出。

      3) 實(shí)現(xiàn)Session緩存中的持久化對(duì)象與關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)保持一致。如果Session緩存中持久化對(duì)象的狀態(tài)改變時(shí),有可能變?yōu)榕R時(shí)對(duì)象或者游離對(duì)象,但在Session緩存中會(huì)按照相應(yīng)的順序調(diào)用session的方法,或者將多條相關(guān)的SQL語句合成,程序運(yùn)行的效率提高,而數(shù)據(jù)庫的訪問減少,系統(tǒng)性能實(shí)現(xiàn)優(yōu)化。

      3.2 Session緩存清理行為

      Hibernate的Session清理緩存是根據(jù)緩存中對(duì)象的狀態(tài)變化,按特定順序執(zhí)行相關(guān)的SQL語句來同步更新數(shù)據(jù)庫的。

      1) 一開始程序會(huì)調(diào)用session.save()方法,將臨時(shí)對(duì)象持久化,讓對(duì)象變?yōu)槌志没瘜?duì)象;

      2) 再執(zhí)行insert語句,插入所有的實(shí)體對(duì)象,剛插入進(jìn)來的實(shí)體對(duì)象服從Session的調(diào)度管理;

      3) 然后執(zhí)行update語句,對(duì)所有實(shí)體對(duì)象進(jìn)行更新操作;

      4) 接著執(zhí)行delete語句,對(duì)所有集合(List、Map、Set)進(jìn)行刪除操作;

      5) 同樣是插入、更新、刪除的SQL語句,再對(duì)所有集合(List、Map、Set)里的元素進(jìn)行對(duì)應(yīng)操作;

      6) 還是執(zhí)行insert插入操作,這次是對(duì)所有集合(List、Map、Set)進(jìn)行插入;

      7) 最后一步調(diào)用session.delete()的方法,刪除所有實(shí)體對(duì)象,清空緩存,騰出內(nèi)存。以上為完整的Session清理緩存的過程,將緩存里的持久化對(duì)象轉(zhuǎn)化為臨時(shí)對(duì)象,再用JVM的垃圾回收器將不在占用內(nèi)存的臨時(shí)對(duì)象回收。

      3.3 Session緩存清理時(shí)間點(diǎn)[6]

      在Session緩存中用setFlushMode()方法來設(shè)置清理緩存的時(shí)間點(diǎn)。FlushMode類定義了三種不同的清理模式:FlushMode.AUTO、FlushMode.COMMIT、FlushMode.NEVER。

      如果選用FulshMode.AUTO模式,在這種模式下session.find(),session.iterate(),transaction.commit(),session.flush()等Session的多種方法和事務(wù)管理都能執(zhí)行清理緩存行為。

      如果選用FlushMode.COMMIT模式,在這種模式下的session.flush(),transaction.commit()都能執(zhí)行清理緩存;

      如果選用FulshMode.NEVER模式,在這種模式下transaction.commit()不能清理緩存,session.find()也不清理緩存,就只能通過session.flush()來清理。

      無論設(shè)置在哪種FlushMode清理模式,session.flush()都將會(huì)去清理緩存,從上述可知優(yōu)先考慮使用FlusthMode.AUTO,很方便地?zé)o須手動(dòng)執(zhí)行session.flush()。

      4 總結(jié)

      Hibernate是一種輕量級(jí)的數(shù)據(jù)持久層框架,使用它能夠高效、高質(zhì)量地開發(fā)出JavaEE應(yīng)用程序。論文對(duì)Hibernate對(duì)象管理機(jī)制進(jìn)行了深入的研究和探討,對(duì)準(zhǔn)確、高效地開發(fā)持久層應(yīng)用程序具有重要的意義。

      參考文獻(xiàn):

      [1] Gavin King,Christian Bauer,Max Rydahl Andersen,et,al.Hibernate Reference Documentation

      [2] 李剛.輕量級(jí)Java EE企業(yè)應(yīng)用實(shí)戰(zhàn):Struts 2+Spring 4+Hibernate整合開發(fā)[M]. 4版.北京:電子工業(yè)出版社,2014.

      [3] 鮑爾,金著.Hibernate實(shí)戰(zhàn)[M].2版·英文版.北京:人民郵電出版社,2009.

      [4] 孫衛(wèi)琴.精通Hibernate:Java對(duì)象持久化技術(shù)詳解[M].2版.北京:電子工業(yè)出版社,2010.

      [5] 樹頭孤鳥.妙解Hibernate.3.X-叩響面向?qū)ο笏枷胫T[M].北京:電子工業(yè)出版社,2010.

      [6] Christian Bauer,Gavin King.Hibernate實(shí)戰(zhàn)[M]. 楊春花,譯.2版·中文版.北京:人民郵電出版社,2008.endprint

      圖2中的代碼段顯示了對(duì)象Customer生命周期的三種狀態(tài)及其轉(zhuǎn)化。在語句(1)中實(shí)例化的customer對(duì)象沒有與數(shù)據(jù)庫中的記錄關(guān)聯(lián),并且沒有被Session緩存管理,因此屬于臨時(shí)對(duì)象。語句(2)打開一個(gè)會(huì)話,獲取數(shù)據(jù)庫連接,直到語句(5)關(guān)閉會(huì)話,將數(shù)據(jù)庫連接歸還到連接池,其中的對(duì)象受到Session緩存的管理。語句(3)開始一個(gè)數(shù)據(jù)庫事務(wù),直到語句(5)提交結(jié)束該事務(wù),語句(3)和(5)之間是數(shù)據(jù)庫的操作,通過語句(5)的事務(wù)提交使Session緩存對(duì)象持久化,和數(shù)據(jù)庫保持一致。因此,可以判斷語句(6)中的對(duì)象c是持久化對(duì)象。語句(8)中的對(duì)象在數(shù)據(jù)庫中有對(duì)應(yīng)的記錄,但脫離了Session緩存的管理,屬于游離對(duì)象,如果沒有其他對(duì)象引用,將被java垃圾回收器回收[4]。

      3 Hibernate對(duì)象持久優(yōu)化[6]

      Hibernate的Session具有一個(gè)由一些集合屬性構(gòu)成的緩存,持久對(duì)象的引用保存在集合中,在這些集合中的對(duì)象和數(shù)據(jù)庫中的相關(guān)記錄始終保持著對(duì)應(yīng),始終使這些Session中的持久化對(duì)象永遠(yuǎn)處于生命周期。Session在某些具體的時(shí)間點(diǎn),按照緩存中持久化對(duì)象的屬性和狀態(tài)變化更新數(shù)據(jù)庫,并且與關(guān)系數(shù)據(jù)庫的記錄保持一致的過程稱為清理緩存[5]。

      3.1 Session緩存的意義[5]

      Session緩存對(duì)于數(shù)據(jù)持久具有十分重要的意義:

      1) 降低數(shù)據(jù)庫訪問頻率,優(yōu)化數(shù)據(jù)庫訪問性能:從內(nèi)存中讀取對(duì)象,節(jié)省了訪問數(shù)據(jù)庫步驟和時(shí)間,從而提高程序運(yùn)行效率。

      2) 如果會(huì)話緩存中的持久化對(duì)象之間是相互循環(huán)關(guān)聯(lián)的,Session緩存會(huì)杜絕出現(xiàn)程序訪問對(duì)象圖時(shí)出現(xiàn)死循環(huán)的現(xiàn)象,和由產(chǎn)生的死循環(huán)而引發(fā)的異常狀況,比如內(nèi)存泄露,堆棧溢出。

      3) 實(shí)現(xiàn)Session緩存中的持久化對(duì)象與關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)保持一致。如果Session緩存中持久化對(duì)象的狀態(tài)改變時(shí),有可能變?yōu)榕R時(shí)對(duì)象或者游離對(duì)象,但在Session緩存中會(huì)按照相應(yīng)的順序調(diào)用session的方法,或者將多條相關(guān)的SQL語句合成,程序運(yùn)行的效率提高,而數(shù)據(jù)庫的訪問減少,系統(tǒng)性能實(shí)現(xiàn)優(yōu)化。

      3.2 Session緩存清理行為

      Hibernate的Session清理緩存是根據(jù)緩存中對(duì)象的狀態(tài)變化,按特定順序執(zhí)行相關(guān)的SQL語句來同步更新數(shù)據(jù)庫的。

      1) 一開始程序會(huì)調(diào)用session.save()方法,將臨時(shí)對(duì)象持久化,讓對(duì)象變?yōu)槌志没瘜?duì)象;

      2) 再執(zhí)行insert語句,插入所有的實(shí)體對(duì)象,剛插入進(jìn)來的實(shí)體對(duì)象服從Session的調(diào)度管理;

      3) 然后執(zhí)行update語句,對(duì)所有實(shí)體對(duì)象進(jìn)行更新操作;

      4) 接著執(zhí)行delete語句,對(duì)所有集合(List、Map、Set)進(jìn)行刪除操作;

      5) 同樣是插入、更新、刪除的SQL語句,再對(duì)所有集合(List、Map、Set)里的元素進(jìn)行對(duì)應(yīng)操作;

      6) 還是執(zhí)行insert插入操作,這次是對(duì)所有集合(List、Map、Set)進(jìn)行插入;

      7) 最后一步調(diào)用session.delete()的方法,刪除所有實(shí)體對(duì)象,清空緩存,騰出內(nèi)存。以上為完整的Session清理緩存的過程,將緩存里的持久化對(duì)象轉(zhuǎn)化為臨時(shí)對(duì)象,再用JVM的垃圾回收器將不在占用內(nèi)存的臨時(shí)對(duì)象回收。

      3.3 Session緩存清理時(shí)間點(diǎn)[6]

      在Session緩存中用setFlushMode()方法來設(shè)置清理緩存的時(shí)間點(diǎn)。FlushMode類定義了三種不同的清理模式:FlushMode.AUTO、FlushMode.COMMIT、FlushMode.NEVER。

      如果選用FulshMode.AUTO模式,在這種模式下session.find(),session.iterate(),transaction.commit(),session.flush()等Session的多種方法和事務(wù)管理都能執(zhí)行清理緩存行為。

      如果選用FlushMode.COMMIT模式,在這種模式下的session.flush(),transaction.commit()都能執(zhí)行清理緩存;

      如果選用FulshMode.NEVER模式,在這種模式下transaction.commit()不能清理緩存,session.find()也不清理緩存,就只能通過session.flush()來清理。

      無論設(shè)置在哪種FlushMode清理模式,session.flush()都將會(huì)去清理緩存,從上述可知優(yōu)先考慮使用FlusthMode.AUTO,很方便地?zé)o須手動(dòng)執(zhí)行session.flush()。

      4 總結(jié)

      Hibernate是一種輕量級(jí)的數(shù)據(jù)持久層框架,使用它能夠高效、高質(zhì)量地開發(fā)出JavaEE應(yīng)用程序。論文對(duì)Hibernate對(duì)象管理機(jī)制進(jìn)行了深入的研究和探討,對(duì)準(zhǔn)確、高效地開發(fā)持久層應(yīng)用程序具有重要的意義。

      參考文獻(xiàn):

      [1] Gavin King,Christian Bauer,Max Rydahl Andersen,et,al.Hibernate Reference Documentation

      [2] 李剛.輕量級(jí)Java EE企業(yè)應(yīng)用實(shí)戰(zhàn):Struts 2+Spring 4+Hibernate整合開發(fā)[M]. 4版.北京:電子工業(yè)出版社,2014.

      [3] 鮑爾,金著.Hibernate實(shí)戰(zhàn)[M].2版·英文版.北京:人民郵電出版社,2009.

      [4] 孫衛(wèi)琴.精通Hibernate:Java對(duì)象持久化技術(shù)詳解[M].2版.北京:電子工業(yè)出版社,2010.

      [5] 樹頭孤鳥.妙解Hibernate.3.X-叩響面向?qū)ο笏枷胫T[M].北京:電子工業(yè)出版社,2010.

      [6] Christian Bauer,Gavin King.Hibernate實(shí)戰(zhàn)[M]. 楊春花,譯.2版·中文版.北京:人民郵電出版社,2008.endprint

      猜你喜歡
      游離語句生命周期
      動(dòng)物的生命周期
      全生命周期下呼吸機(jī)質(zhì)量控制
      莫須有、蜿蜒、夜游離
      重點(diǎn):語句銜接
      從生命周期視角看并購(gòu)保險(xiǎn)
      民用飛機(jī)全生命周期KPI的研究與應(yīng)用
      精彩語句
      超薄游離股前外側(cè)皮瓣修復(fù)足背軟組織缺損
      游離血紅蛋白室內(nèi)質(zhì)控物的制備及應(yīng)用
      游離于翻譯的精確與模糊之間——兼評(píng)第八屆CASIO杯翻譯競(jìng)賽獲獎(jiǎng)譯文
      师宗县| 株洲县| 舞钢市| 昌邑市| 宁海县| 思南县| 连山| 汪清县| 来凤县| 宜宾县| 大姚县| 石林| 澜沧| 彰化市| 右玉县| 陵水| 鲁甸县| 新邵县| 琼海市| 南澳县| 桐城市| 安庆市| 宝清县| 乌拉特中旗| 胶南市| 陈巴尔虎旗| 金昌市| 祁东县| 晴隆县| 行唐县| 台江县| 宁陵县| 沧州市| 电白县| 临江市| 眉山市| 玛纳斯县| 兴文县| 曲靖市| 习水县| 尉犁县|