日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hibernate之缓存

發(fā)布時間:2023/12/31 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hibernate之缓存 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. ? 緩存概念應(yīng)用數(shù)據(jù)庫訪問數(shù)據(jù)庫的代價很高,利用持久化的緩存可以減少與數(shù)據(jù)庫之間的交互,可以從緩存中讀取。

? ? 注意:緩存使用不當(dāng),會造成性能的損失。要在正確使用緩存的前提下,適當(dāng)情況使用緩存。

2. ?持久化緩存的級別:

(1)事務(wù)級別:

????緩存對象只能被當(dāng)前事務(wù)使用,每個事務(wù)都有自己的緩存。事務(wù)結(jié)束,緩存也結(jié)束。

? ? 緩存數(shù)據(jù)以關(guān)聯(lián)對象的形式保存,使用內(nèi)存作為介質(zhì),hibernate的一級緩存即是事務(wù)級別。 ??

(2)應(yīng)用(進(jìn)程)級別:

????可被當(dāng)前應(yīng)用(進(jìn)程)的所有事務(wù)訪問。

????分布式應(yīng)用不能使用該級緩存,使用內(nèi)存或硬盤作為儲存介質(zhì)。hibernate的二級緩存可以是此。

(3)分布式級別:

????若應(yīng)用部署在多臺服務(wù)器的分布式(集群)環(huán)境下,數(shù)據(jù)可被多臺服務(wù)器共享。

? ? 要慎重使用該級別的緩存,多臺服務(wù)器同步緩存可能會消耗大量的帶寬。hibernate的二級緩存也可以是此?。

3. ?hibernate的一級緩存?

?(1)概念:是內(nèi)置緩存,不能人為地取消,也稱session緩存。事務(wù)級別的緩存,若一次事務(wù)多次修改對象,提交時只會執(zhí)行一條語句,更新所有的修改。

(2)實現(xiàn)原理:可以把一級緩存想象為session對象維護(hù)的一個map對象,保存session使用過的對象,session讀取數(shù)據(jù)時先依據(jù)對象的類型和標(biāo)識符屬性查找,沒有在讀數(shù)據(jù)庫,同時保存在map中。

(3)管理一級緩存:

? ? ?使用session.evict() 方法移除緩存對象,使之變?yōu)橥泄軤顟B(tài)。

? ? ?使用session.clear()方法清除緩存中的所有對象。

? ? ?使用session的contains()判斷是否在一級緩存中, flush()同步數(shù)據(jù)與數(shù)據(jù)庫一致,setReadOnly()設(shè)置為只讀對象(不執(zhí)行臟數(shù)據(jù)檢查)

4. ?hibernate的二級緩存?

?(1)概念:由SessionFactory對象管理,應(yīng)用級別緩存,又稱為SessionFactory緩存。會被整個應(yīng)用的session共享。先一級,在二級。

?(2)二級緩存組件:hibernate沒有自己的二級緩存組件

組件

Provider類

類型

集群

查詢緩存

Hashtable

org.hibernate.cache.HashtableCacheProvider

內(nèi)存

不支持

支持

EHCache

org.hibernate.cache.EhCacheProvider

內(nèi)存,硬盤

不支持

支持

OSCache

org.hibernate.cache.OSCacheProvider

內(nèi)存,硬盤

不支持

支持

SwarmCache

org.hibernate.cache.SwarmCacheProvider

集群

支持

不支持

JBoss Cache

org.hibernate.cache.TreeCacheProvider

集群

支持

支持

?(3)二級緩存策略:

●?? 只讀緩存(read-only)

?????? 如果應(yīng)用程序需要讀取一個持久化類的實例,但并不打算修改它們,可以使用read-only緩存。

????????對于從來不會修改的數(shù)據(jù),如參考數(shù)據(jù),可以使用這種并發(fā)訪問策略。

●?? 讀/寫緩存(read-write)

?????? 如果應(yīng)用程序需要更新數(shù)據(jù),該緩存比較合適。如果需要序列化事務(wù)隔離級別,那么就不能使用這種緩存策略。

????????若在分布式應(yīng)用中使用該策略,需要底層的緩存組件支持鎖定機(jī)制。

●?? 不嚴(yán)格的讀/寫緩存(nonstrict-read-write)

?????? 如果程序讀取頻繁且極少更新數(shù)據(jù)(也就是說,出現(xiàn)兩個事務(wù)同時更新同一個條目的現(xiàn)象很不常見),也不需要十分嚴(yán)格的事務(wù)隔離,適用該緩存。

????????對于極少被修改,并且允許偶爾臟讀的數(shù)據(jù),可以采用這種并發(fā)訪問策略。

●?? 事務(wù)緩存(transactional)

?????? transactional緩存策略提供了對全事務(wù)的緩存,僅僅用于JTA環(huán)境中。它提供了Repeatable Read事務(wù)隔離級別。

(4)管理二級緩存:

? ? ? ? SessionFactory對象的evict(Class arg0)方法:

? ? ? ? ? ? ? ? 可以從二級緩存中清除指定的持久化類的所有緩存對象,并釋放其占用的資源。

? ? ? ? ? ? ? ? 如:sessionFactory.evict(Category.class);

? ? ? ? SessionFactory對象的evict(Class arg0,Serializable arg1)方法:

? ? ? ? ? ? ? ? 可以從二級緩存中清除某個持久化類的指定緩存對象。

? ? ? ? ? ? ? ? 如:sessionFactory.evict(Category.class,new Integer(1));

? ? ? ? SessionFactory對象的evictCollection(String arg0)方法:

? ? ? ? ? ? ? ? 可以從二級緩存中清除指定的集合對象的緩存。

? ? ? ? ? ? ? ? 如:sessionFactory.evictCollection("com.hibernate.beans.products");

? ? ? ? ?SessionFactory對象的evictCollection(String arg0,Serializable arg1)方法:

? ? ? ? ? ? ? ? 可以從二級緩存中清除集合對象中的指定對象。

? ? ? ? ? ? ? ? 如:sessionFactory.evictCollection("com.hibernate.beans.products",new Integer(1));

? ? ? ? SessionFactory對象的evictEntity(String arg0)方法:

? ? ? ? ? ? ? ? 可以從二級緩存中清除指定的持久化類的所有緩存對象。

? ? ? ? ? ? ? ? 如:sessionFacotry.evictEntity("com.hibernate.beans.Category");

? ? ? ???SessionFactory對象的evictEntity(String arg0,Serializable arg1)方法:

? ? ? ? ? ? ? ?可以從二級緩存中清除某個持久化類的指定對象。

? ? ? ? ? ? ? ?如:sessionFacotry.evictEntity("com.hibernate.beans.Category",new Integer(1));

5. ?查詢緩存

? ? ? ? 查詢緩存使用map對象保存被緩存對象,(key值根據(jù)sql、查詢參數(shù)、分頁參數(shù)等構(gòu)造)保證同樣查詢有同樣key值;

? ? ? ? hibernate會記錄每個表的最后更新時間,并且查詢緩存也有時間,hibernate會比較這兩個時間判斷緩存有效性。

6. 緩存對get(), load(), list(), iterator() 方法的影響

(1)get():先從一級緩存,后直接從數(shù)據(jù)庫。緩存到一級緩存。

(2)load():先從一級緩存,再從二級緩存,最后從數(shù)據(jù)庫。緩存到一二級緩存。

(3)Query的list():先檢查是否配置查詢緩存,在直接從數(shù)據(jù)庫中;緩存到一二級,查詢緩存中。

(4) Query的iterator():先從數(shù)據(jù)庫查詢所有符合條件的標(biāo)識符屬性值(id),再通過load()方法查詢對應(yīng)數(shù)據(jù)。


注:本文參考《Hibernate開發(fā)與實戰(zhàn)》 劉偉 張利國 電子工業(yè)出版社 一書

轉(zhuǎn)載于:https://blog.51cto.com/lindianli/1433809

總結(jié)

以上是生活随笔為你收集整理的hibernate之缓存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。