posts - 66,  comments - 11,  trackbacks - 0
              實(shí)體對象,特指Hibernate O/R映射關(guān)系中的域?qū)ο蟆?shí)體對象生命周期中的3種狀態(tài)
              1、Transient(自由狀態(tài)):所謂Transient,即實(shí)體對象在內(nèi)存中的自由存在,它與數(shù)據(jù)庫中的記錄無關(guān)。
              2、Persistent(持久狀態(tài)):即實(shí)體對象處于由Hibernate框架所管理的狀態(tài)。
              3、Detached(游離狀態(tài)):處于Persistent狀態(tài)的對象,其對應(yīng)的Session實(shí)例關(guān)閉之后,那么,此對象就處于"Detached"狀態(tài)。
              Transient狀態(tài)的user對象與庫表的數(shù)據(jù)缺乏對應(yīng)關(guān)系,而Detached狀態(tài)的user對象,卻在庫表中存在對應(yīng)的記錄,只不過由于Detached對象脫離了session這個(gè)數(shù)據(jù)操作平臺,其狀態(tài)的變化無法更新到庫表中的對應(yīng)記錄。
              處于Transient和Detached狀態(tài)的對象統(tǒng)稱為值對象(VO),而處于Persistent狀態(tài)的對象稱為持久對象(PO).這是站在實(shí)體對象是否被納入Hibernate實(shí)體管理容器的立場加以區(qū)分的,非管理的實(shí)體對象統(tǒng)稱為VO,而被管理的實(shí)體對象稱為PO.
          VO與PO的主要區(qū)別在于:
          1、VO是相對獨(dú)立的實(shí)體對象,處于非管理狀態(tài)。
          2、PO是由Hibernate納入其實(shí)體管理容器的對象,它代表了與數(shù)據(jù)庫中某條記錄對應(yīng)的Hibernate實(shí)體,PO的變化在事務(wù)提交時(shí)將反映到實(shí)際數(shù)據(jù)庫中
          3、如果一個(gè)PO與其對應(yīng)的Session實(shí)例分離,那么此時(shí),它又會變成一個(gè)VO。

              不覆蓋equals/hashCode方法的情況下我們要面對的問題:實(shí)體對象的跨session識別。解決辦法一個(gè)是實(shí)現(xiàn)所謂的值比對,即在equals/hashCode方法中,對實(shí)體類的所有屬性值進(jìn)行比對.除了值比對,還有另外一種基于業(yè)務(wù)邏輯的對象判定方式業(yè)務(wù)關(guān)鍵信息判定。

              tx.commint();方法中會調(diào)用session.flush()方法,在flush()方法中會執(zhí)行2個(gè)主要任務(wù)
          1、flushEverything();//刷新所有數(shù)據(jù)
          2、execute(0);//執(zhí)行數(shù)據(jù)庫SQL完成持久化動作。

              數(shù)據(jù)緩存:在特定硬件基礎(chǔ)上緩存往往是提升系統(tǒng)性能的關(guān)鍵因素。緩存是數(shù)據(jù)庫數(shù)據(jù)在內(nèi)存中的臨時(shí)容器,它包含了庫表數(shù)據(jù)在內(nèi)存中的臨時(shí)拷貝,位于數(shù)據(jù)庫與數(shù)據(jù)訪問層之間。ORM在進(jìn)行數(shù)據(jù)讀取時(shí),會根據(jù)其緩存管理策略,首先在緩存中查詢,如果在緩存中發(fā)現(xiàn)所需數(shù)據(jù),則直接以此數(shù)據(jù)作為查詢結(jié)果加以利用,從而避免了數(shù)據(jù)庫調(diào)用的性能開銷。
              相對內(nèi)存操作而言,數(shù)據(jù)庫調(diào)用是一個(gè)代價(jià)高昂的過程,對于典型企業(yè)及應(yīng)用結(jié)構(gòu),數(shù)據(jù)庫往往與應(yīng)用服務(wù)器位于不同的物理服務(wù)器,這也就意味著每次數(shù)據(jù)庫訪問都是一次遠(yuǎn)程調(diào)用,Socket的創(chuàng)建與銷毀,數(shù)據(jù)的打包拆包,數(shù)據(jù)庫執(zhí)行查詢命令,網(wǎng)絡(luò)傳輸上的延時(shí),這些消耗都給系統(tǒng)整體性能造成了嚴(yán)重影響。
              ORM的數(shù)據(jù)緩存應(yīng)包含如下幾個(gè)層次:
          1、事務(wù)級緩存:事務(wù)級緩存是基于Session生命周期實(shí)現(xiàn)的,每個(gè)Session會在內(nèi)部維持一個(gè)數(shù)據(jù)緩存,此緩存隨著Session的創(chuàng)建而存在,因此也成為Session Level Cache(內(nèi)部緩存)
          2、應(yīng)用級/進(jìn)程級緩存:在某個(gè)應(yīng)用中,或者應(yīng)用中某個(gè)獨(dú)立數(shù)據(jù)訪問子集中的共享緩存。此緩存可由多個(gè)事物共享。在Hibernate中,應(yīng)用級緩存在SessinFactory層實(shí)現(xiàn),所有由此SessionFactory創(chuàng)建的Session實(shí)例共享此緩存。多實(shí)例并發(fā)運(yùn)行的環(huán)境要特別小心進(jìn)程級緩存的調(diào)用。
          3、分布式緩存:分布式緩存由多個(gè)應(yīng)用級緩存實(shí)例組成集群,通過某種遠(yuǎn)程機(jī)制實(shí)現(xiàn)各個(gè)緩存實(shí)例間的數(shù)據(jù)同步,任何一個(gè)實(shí)例的數(shù)據(jù)修改操作,將導(dǎo)致整個(gè)集群間的數(shù)據(jù)狀態(tài)同步。由于多個(gè)實(shí)例間的數(shù)據(jù)同步機(jī)制,每個(gè)緩存實(shí)例發(fā)生的變動都會復(fù)制到其余所有節(jié)點(diǎn)中,這樣的遠(yuǎn)程同步開銷不可忽視。

              Hibernate數(shù)據(jù)緩存分為2個(gè)層次,1、內(nèi)部緩存2、二級緩存hibernate中,緩存將在以下情況中發(fā)揮作用:
          1、通過ID加載數(shù)據(jù)時(shí)
          這包括了根據(jù)id查詢數(shù)據(jù)的Session.load方法,以及Session.ierate等批量查詢方法
          2、延遲加載

              Session在進(jìn)行數(shù)據(jù)查詢操作時(shí),會首先在自身內(nèi)部的一級緩存中進(jìn)行查找,如果一級緩存未能命中,則將在二級緩存中查詢,如果二級緩存命中,則以此數(shù)據(jù)作為結(jié)果返回。
              如果數(shù)據(jù)滿足以下條件,則可將其納入緩存管理
          1、數(shù)據(jù)不會被第三方應(yīng)用修改
          2、數(shù)據(jù)大小在可接受的范圍之內(nèi)
          3、數(shù)據(jù)更新頻率較低
          4、同一數(shù)據(jù)可能會被系統(tǒng)頻繁引用
          5、非關(guān)鍵數(shù)據(jù)(關(guān)鍵數(shù)據(jù),如金融賬戶數(shù)據(jù))
          Hibernate本身并未提供二級緩存的產(chǎn)品化實(shí)現(xiàn)(只是提供了一個(gè)基于Hashtable的簡單緩存以供調(diào)試),而是為眾多的第三方緩存組件提供了接入接口,我們可以根據(jù)實(shí)際情況選擇不同的緩存實(shí)現(xiàn)版本。

             
          posted on 2009-12-22 15:01 王永慶 閱讀(224) 評論(0)  編輯  收藏 所屬分類: HIBERNATE
          <2009年12月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          關(guān)注blogs

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 盈江县| 南靖县| 舞阳县| 淅川县| 南宁市| 中西区| 土默特左旗| 石楼县| 交口县| 宜兰县| 文水县| 东丽区| 三河市| 泰州市| 东城区| 新巴尔虎右旗| 阿荣旗| 翁源县| 高安市| 称多县| 莲花县| 麟游县| 巴彦县| 东莞市| 姜堰市| 新郑市| 郴州市| 望谟县| 调兵山市| 彭山县| 米脂县| 海伦市| 旌德县| 驻马店市| 南岸区| 丽江市| 廉江市| 绥中县| 和顺县| 西吉县| 乐至县|