1.減少訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的頻率,應(yīng)用程序從內(nèi)存中讀取持久化對(duì)象的速度顯然比到數(shù)據(jù)庫(kù)查詢(xún)數(shù)據(jù)的速度快多了,因此Session的緩存可以提高數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn)性能。
2.保證緩存中的對(duì)象與數(shù)據(jù)庫(kù)中的記錄保持同步,當(dāng)緩存中持久化對(duì)象的狀態(tài)發(fā)生了變化,Session并不會(huì)立即執(zhí)行相關(guān)的SQL語(yǔ)句,這使得Session能夠把幾條相關(guān)的Sql語(yǔ)句合并為一條sql語(yǔ)句,以便減少訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的次數(shù),從而提高應(yīng)用程序的性能。
session一級(jí)緩存:
1.當(dāng)session的save()方法持久化一個(gè)對(duì)象時(shí),對(duì)象會(huì)被加入到session的緩存中,即加入到內(nèi)存中去,以后即使應(yīng)用程序中的引用變量不再引用該對(duì)象,只要session的緩存沒(méi)有被清空,該對(duì)象就仍然處于生命周期中
2.當(dāng)session的load()方法試圖從數(shù)據(jù)庫(kù)中加載一個(gè)對(duì)象時(shí),session先判斷緩存中是否存在這個(gè)對(duì)象,如果存在就不會(huì)再到數(shù)據(jù)庫(kù)中查詢(xún)了。load方法在加載數(shù)據(jù)的時(shí)候并沒(méi)有獲取一個(gè)完整的對(duì)象,它只是獲取到了一個(gè)該對(duì)象的OID,當(dāng)你的程序使用到了這個(gè)對(duì)象時(shí)會(huì)先判斷緩存中有沒(méi)有這個(gè)對(duì)象。如果有就不會(huì)到數(shù)據(jù)庫(kù)中查詢(xún)。如果沒(méi)有就會(huì)再去數(shù)據(jù)庫(kù)中查詢(xún)。
hibernate中的實(shí)體對(duì)象的三種狀態(tài):
1.瞬時(shí)狀態(tài):剛剛用new語(yǔ)句創(chuàng)建,還沒(méi)有被持久化,不處于session緩存中,與數(shù)據(jù)庫(kù)沒(méi)有建立任何聯(lián)系。
2.持久化狀態(tài):已經(jīng)被持久化,加入到session的緩存當(dāng)中,即實(shí)體對(duì)象在hibernate框架所管理的狀態(tài)。與數(shù)據(jù)中的數(shù)據(jù)建立了聯(lián)系。
3.游離狀態(tài):已經(jīng)持久化但不處于session的緩存當(dāng)中,當(dāng)session對(duì)象關(guān)閉時(shí),但是對(duì)象和數(shù)據(jù)庫(kù)中建立了聯(lián)系,這時(shí)該對(duì)象并未受到session實(shí)例的管理。稱(chēng)之為游離狀態(tài)。或者說(shuō)是托管狀態(tài)。
Session的update方法完成以下操作:
1.把對(duì)象重新加載到Session緩存當(dāng)中,使他成為持久化對(duì)象,
2.計(jì)劃執(zhí)行一個(gè)update語(yǔ)句。值得注意的是:Session只有在清理緩存的時(shí)候才會(huì)執(zhí)行update語(yǔ)句。并且在執(zhí)行時(shí)才會(huì)把對(duì)象當(dāng)前的屬性值組裝到update語(yǔ)句中。因此。即使程序中多次修改了對(duì)象的屬性值在清理緩存的時(shí)候也只會(huì)執(zhí)行一次update語(yǔ)句。
清理緩存:是指按照緩存當(dāng)中的對(duì)象的狀態(tài)的變化來(lái)同步更新數(shù)據(jù)庫(kù)。
session清理緩存的時(shí)間點(diǎn):
1.當(dāng)程序調(diào)用事物提交的時(shí)候,tx.commit()方法被執(zhí)行時(shí),commit()方法會(huì)先清理緩存,然后再向數(shù)據(jù)庫(kù)提交事物。
2.當(dāng)程序顯示調(diào)用session的flush()方法的時(shí)候,也會(huì)清理緩存。