? |
| ? |
| 發(fā)布時(shí)間:2007.08.14 06:06 ???? 來源:賽迪網(wǎng) ???? 作者:dxaw |
|
對(duì)于session這個(gè)接口的學(xué)習(xí)可以說是最痛苦也是最復(fù)雜的,因?yàn)樗婕暗姆矫嫣嗔耍恍╇[藏的機(jī)制也很多,誰讓它是Central API呢。 ? 對(duì)于它的幾個(gè)最基本的方法如save()、delete()、flush()等的學(xué)習(xí)都花了我一定的時(shí)間。在深入了解這些這些方法前,了解session的緩存機(jī)制以及Hibernate中Java對(duì)象的狀態(tài)對(duì)我們是很有幫助的。 ? 一.Session的緩存 ? Java是純面向?qū)ο蟮恼Z言,因此不可能像C語言那樣直接操縱內(nèi)存 ,例如聲明一段可用的內(nèi)存空間。在Java里面,緩存通常是指Java對(duì)象的屬性占用的內(nèi)存空間,通常是一些集合類型的屬性。在session接口的實(shí)現(xiàn)類SessionImpl中定義了一系列的Java集合,這些Java集合就構(gòu)成了Session的緩存。 ? 使用緩存的一個(gè)很明顯的好處就是可以減少數(shù)據(jù)庫(kù)訪問的頻率,提高應(yīng)用程序的性能,因?yàn)閺膬?nèi)存中讀取數(shù)據(jù)顯然要比從數(shù)據(jù)庫(kù)中查詢快多了 。根據(jù)我個(gè)人的理解,Session的緩存實(shí)際上起到了一個(gè)“過渡倉(cāng)庫(kù)”作用。就像魔獸中的英雄一樣,身上都會(huì)背有一個(gè)包,用來存放常用的物品如補(bǔ)血藥水、補(bǔ)魔藥水、回城卷等等。 如果想用回城卷而身上沒有回程卷的話就要跑到商店去shopping了,這樣就會(huì)浪費(fèi)大量的時(shí)間了,除非你此刻就在商店旁邊;如果想用的回城卷的時(shí)候身上就有的話,英雄就可以直接用而不必大老遠(yuǎn)的跑到商店去了。我們的Session的緩存可以說就相當(dāng)于英雄身上的背包,我的應(yīng)用程序就是英雄,而數(shù)據(jù)庫(kù)就是商店咯,(高,實(shí)在是高!!!!!!) 如下圖所示。
當(dāng)然這個(gè)比喻不是很準(zhǔn)確了,比方說在Hibernate應(yīng)用中我們可以向數(shù)據(jù)庫(kù)插入一條新的記錄,而在魔獸中你是不可能給商店增加存貨量的,只是為了便于理解,才作了這么一個(gè)對(duì)比。 ? 二.Hibernate中Java對(duì)象的狀態(tài) ? 在一個(gè)Hibernate應(yīng)用中,Java對(duì)象可以處于以下三個(gè)狀態(tài)之一: ? 1.臨時(shí)狀態(tài)(Transient)。處于這個(gè)狀態(tài)的對(duì)象還被沒有納入Hibernate的緩存管理體系,跟任何session都不關(guān)聯(lián),在數(shù)據(jù)庫(kù)中也沒有對(duì)應(yīng)的記錄。 ? 2.持久化狀態(tài)(Persistent)。處于這個(gè)狀態(tài)的對(duì)象位于Session的緩存中,并且和數(shù)據(jù)庫(kù)中的一條數(shù)據(jù)記錄相對(duì)應(yīng)。 ? 3.游離狀態(tài)(Detached)。處于這個(gè)狀態(tài)的對(duì)象不再位于Session的緩存中,它與臨時(shí)對(duì)象的最大區(qū)別在于,游離對(duì)象在數(shù)據(jù)庫(kù)中還可能存在一條與它對(duì)應(yīng)的記錄。 ? 上述3個(gè)狀態(tài)之間是可以相互轉(zhuǎn)化的,而且我 們所說的狀態(tài)都是針對(duì)某一個(gè)session實(shí)例而言的,比方說,對(duì)象A對(duì)于session1而言是處于持久化狀態(tài)的,因?yàn)樗幱趕ession1的緩存中,但是對(duì)于session2而言對(duì)象A并不在它的緩存中,因此它是處于游離狀態(tài)的 。 ? 對(duì)于這幾個(gè)狀態(tài)的理解花費(fèi)了我一定的時(shí)間,因?yàn)榭偸怯幸恍┫∑婀殴值哪铑^在我腦海中產(chǎn)生。比如說,對(duì)于臨時(shí)狀態(tài)的定義,如果我新建一個(gè)對(duì)象,然后人為的讓它屬性的值和數(shù)據(jù)庫(kù)中的一條記錄對(duì)應(yīng),包括id的取值都一樣。此時(shí)它能否說是處于游離狀態(tài)呢?因?yàn)樗鸵粭l記錄想對(duì)應(yīng)呀。實(shí)際上這些情況都是由于一些不和規(guī)范的操作而產(chǎn)生的。在Hibernate應(yīng)用中,無論Java對(duì)象處于臨時(shí)狀態(tài)、持久化狀態(tài)還是游離狀態(tài),應(yīng)用程序都不應(yīng)該修改它的OID。OID的值應(yīng)該由Hibernate來維護(hù)和負(fù)責(zé),實(shí)際上Hibernate在同步緩存中的對(duì)象與數(shù)據(jù)庫(kù)中的記錄時(shí),都是通過OID來進(jìn)行關(guān)聯(lián)和映射的,如果應(yīng)用程序人為的修改了對(duì)象的OID,就會(huì)導(dǎo)致一些莫名其妙的錯(cuò)誤,而且這樣也不利于數(shù)據(jù)的同步 |
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

