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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hibernate二级缓存理解

發布時間:2025/4/5 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hibernate二级缓存理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

??????????緩存是介于應用程序和物理數據源之間,其作用是為了降低應用程序對物理數據源訪問的頻次,從而提高了應用的運行性能。緩存內的數據是對物理數據源中的數據的復制,應用程序在運行時從緩存讀寫數據,在特定的時刻或事件會同步緩存和物理數據源的數據。
? ????????緩存的介質一般是內存,所以讀寫速度很快。但如果緩存中存放的數據量非常大時,也會用硬盤作為緩存介質。緩存的實現不僅僅要考慮存儲的介質,還要考慮到管理緩存的并發訪問和緩存數據的生命周期。

????Hibernate的緩存包括Session的緩存和SessionFactory的緩存。

????其中SessionFactory的緩存又可以分為兩類:內置緩存和外置緩存。

????Session的緩存是內置的,不能被卸載,也被稱為Hibernate的第一級緩存。????

????SessionFactory的內置緩存和Session的緩存在實現方式上比較相似,前者是SessionFactory對象的一些集合屬性包含的數據,后者是指Session的一些集合屬性包含的數據。

????SessionFactory的內置緩存中存放了映射元數據(metadata)和預定義SQL語句(preparedstatement)

????映射元數據是映射文件中數據的拷貝,而預定義SQL語句是在Hibernate初始化階段根據映射元數據推導出來

????SessionFactory的內置緩存是只讀的,應用程序不能修改緩存中的映射元數據和預定義SQL語句,因此SessionFactory不需要進行內置緩存與映射文件的同步。

????SessionFactory的外置緩存是一個可配置的插件。在默認情況下,SessionFactory不會啟用這個插件。外置緩存的數據是數據庫數據的拷貝,外置緩存的介質可以是內存或者硬盤。SessionFactory的外置緩存也被稱為Hibernate的第二級緩存。????????

??? Hibernate的這兩級緩存都位于持久化層,存放的都是數據庫數據的拷貝,那么它們之間的區別是什么呢?為了理解二者的區別,需要深入理解持久化層的緩存的兩個特性:緩存的范圍和緩存的并發訪問策略。
????
????持久化層的緩存的范圍

????緩存的范圍決定了緩存的生命周期以及可以被誰訪問。緩存的范圍分為三類。

? ????1 事務范圍:緩存只能被當前事務訪問。緩存的生命周期依賴于事務的生命周期,當事務結束時,緩存也就結束生命周期。在此范圍下,緩存的介質是內存。事務可以是數據庫事務或者應用事務,每個事務都有獨自的緩存,緩存內的數據通常采用相互關聯的的對象形式。

? ????2 進程范圍:緩存被進程內的所有事務共享。這些事務有可能是并發訪問緩存,因此必須對緩存采取必要的事務隔離機制。緩存的生命周期依賴于進程的生命周期,進程結束時,緩存也就結束了生命周期。進程范圍的緩存可能會存放大量的數據,所以存放的介質可以是內存或硬盤。緩存內的數據既可以是相互關聯的對象形式也可以是對象的松散數據形式。松散的對象數據形式有點類似于對象的序列化數據,但是對象分解為松散的算法比對象序列化的算法要求更快。

? ????3 集群范圍:在集群環境中,緩存被一個機器或者多個機器的進程共享。緩存中的數據被復制到集群環境中的每個進程節點,進程間通過遠程通信來保證緩存中的數據的一致性,緩存中的數據通常采用對象的松散數據形式。

? ????對大多數應用來說,應該慎重地考慮是否需要使用集群范圍的緩存,因為訪問的速度不一定會比直接訪問數據庫數據的速度快多少。

? ????持久化層可以提供多種范圍的緩存。如果在事務范圍的緩存中沒有查到相應的數據,還可以到進程范圍或集群范圍的緩存內查詢,如果還是沒有查到,那么只有到數據庫中查詢。事務范圍的緩存是持久化層的第一級緩存,通常它是必需的;進程范圍或集群范圍的緩存是持久化層的第二級緩存,通常是可選的。
????
????持久化層的緩存的并發訪問策略

????當多個并發的事務同時訪問持久化層的緩存的相同數據時,會引起并發問題,必須采用必要的事務隔離措施。

????在進程范圍或集群范圍的緩存,即第二級緩存,會出現并發問題。因此可以設定以下四種類型的并發訪問策略,每一種策略對應一種事務隔離級別。

? ????事務型(transactional):僅僅在受管理環境中適用。它提供了Repeatable Read事務隔離級別。對于經常被讀但很少修改的數據,可以采用這種隔離類型,因為它可以防止臟讀和不可重復讀這類的并發問題。

? ????讀寫型(read-write):提供了Read Committed事務隔離級別。僅僅在非集群的環境中適用。對于經常被讀但很少修改的數據,可以采用這種隔離類型,因為它可以防止臟讀這類的并發問題。

? ????非嚴格讀寫型(nonstrict-read-write):不保證緩存與數據庫中數據的一致性。如果存在兩個事務同時訪問緩存中相同數據的可能,必須為該數據配置一個很短的數據過期時間,從而盡量避免臟讀。對于極少被修改,并且允許偶爾臟讀的數據,可以采用這種并發訪問策略。

? ????只讀型(read-only):對于從來不會修改的數據,如參考數據,可以使用這種并發訪問策略。

? ????事務型并發訪問策略是事務隔離級別最高,只讀型的隔離級別最低。事務隔離級別越高,并發性能就越低。
????
????什么樣的數據適合存放到第二級緩存中?
????
????1 很少被修改的數據
????
????2 不是很重要的數據,允許出現偶爾并發的數據
????
????3 不會被并發訪問的數據
????
????4 參考數據
????
????不適合存放到第二級緩存的數據?
????
????1 經常被修改的數據
????
????2 財務數據,絕對不允許出現并發
????
????3 與其他應用共享的數據。
????
????Hibernate的二級緩存

? ????如前所述,Hibernate提供了兩級緩存,第一級是Session的緩存。由于Session對象的生命周期通常對應一個數據庫事務或者一個應用事務,因此它的緩存是事務范圍的緩存。第一級緩存是必需的,不允許而且事實上也無法比卸除。在第一級緩存中,持久化類的每個實例都具有唯一的OID。

? ????第二級緩存是一個可插拔的的緩存插件,它是由SessionFactory負責管理。由于SessionFactory對象的生命周期和應用程序的整個過程對應,因此第二級緩存是進程范圍或者集群范圍的緩存。這個緩存中存放的對象的松散數據。第二級對象有可能出現并發問題,因此需要采用適當的并發訪問策略,該策略為被緩存的數據提供了事務隔離級別。緩存適配器用于把具體的緩存實現軟件與Hibernate集成。第二級緩存是可選的,可以在每個類或每個集合的粒度上配置第二級緩存。
????
????Hibernate的二級緩存策略的一般過程如下:
????
????1) 條件查詢的時候,總是發出一條select * from table_name where …. (選擇所有字段)這樣的SQL語句查詢數據庫,一次獲得所有的數據對象。
????
????2) 把獲得的所有數據對象根據ID放入到第二級緩存中。
????
????3) 當Hibernate根據ID訪問數據對象的時候,首先從Session一級緩存中查;查不到,如果配置了二級緩存,那么從二級緩存中查;查不到,再查詢數據庫,把結果按照ID放入到緩存。
????
????4) 刪除、更新、增加數據的時候,同時更新緩存。

? ????Hibernate的二級緩存策略,是針對于ID查詢的緩存策略,對于條件查詢則毫無作用。為此,Hibernate提供了針對條件查詢的Query緩存。
????
????Hibernate的Query緩存策略的過程如下:
????
????1) Hibernate首先根據這些信息組成一個Query Key,Query Key包括條件查詢的請求一般信息:SQL, SQL需要的參數,記錄范圍(起始位置rowStart,最大記錄個數maxRows),等。
????
????2) Hibernate根據這個Query Key到Query緩存中查找對應的結果列表。如果存在,那么返回這個結果列表;如果不存在,查詢數據庫,獲取結果列表,把整個結果列表根據Query Key放入到Query緩存中。
????
????3) Query Key中的SQL涉及到一些表名,如果這些表的任何數據發生修改、刪除、增加等操作,這些相關的Query Key都要從緩存中清空。????????????

?????當hibernate更新數據庫的時候,它怎么知道更新哪些查詢緩存呢?
???? hibernate會在一個地方維護每個表的最后更新時間,其實也就是放在net.sf.hibernate.cache.UpdateTimestampsCache所指定的緩存配置里面,可以去你配置的里面找這個文件名稱.data。
???? 當通過hibernate更新的時候,hibernate會知道這次更新影響了哪些表。然后它更新這些表的最后更新時間。每個緩存都有一個創建時間和這個緩存所查詢的表,當hibernate查詢一個緩存是否存在的時候,如果緩存存在,它還要取出緩存的創建時間和這個緩存所查詢的表,然后去查找這些表的最后更新時間,如果有一個表在創建時間后更新過了,那么這個緩存是無效的。
可以看出,只要更新過一個表,那么凡是涉及到這個表的查詢緩存就失效了,因此查詢緩存的命中率可能會比較低。

?

轉載于:https://my.oschina.net/wanyuxiang000/blog/288337

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久久久久国产精品免费 | 一区二区三区四区在线免费观看 | 少妇视频在线观看 | 欧美网站免费 | 一级伦理农村妇女愉情 | 黄色日本视频 | 97在线影院 | 日本少妇bbwbbw精品 | 欧美日韩人妻精品一区二区 | 亚洲你懂得 | 91操操 | 久久成人国产精品入口 | 男人都懂的网站 | 黄色网址国产 | 中文字幕日本一区二区 | 美女网站黄页 | 日韩一区二区视频在线播放 | 麻豆md0034在线观看 | 亚洲欧美一区二区精品久久久 | 国产最新精品视频 | 天堂一区二区三区四区 | 国产寡妇亲子伦一区二区三区四区 | 精品人妻一区二区三区蜜桃 | 精品自拍av | 日韩精品无码一区二区三区 | 91精品国产综合久久久蜜臀图片 | 国产一区二区三区免费观看视频 | 91免费在线播放 | 日韩欧美一区二区三区视频 | 在线观视频免费观看 | 91视色 | 一边摸一边抽搐一进一出视频 | 污污的视频在线观看 | 牛牛电影国产一区二区 | 成人依人 | 91在线视频免费播放 | 欧美精品在线视频 | 伊人久久国产精品 | 开心激情综合网 | 欧美乱大交xxxxx春色视频 | 91重口味| 毛片大全在线观看 | 色噜噜在线 | 久久久久久美女 | 中文字幕蜜桃 | 在线一级视频 | 领导揉我胸亲奶揉下面 | 国产黑丝视频 | 一区二区三区视频在线观看 | 国产做爰免费观看视频 | 欧美日韩1 | 亚洲天堂999 | 9cao| 殴美毛片 | 国产操操操 | 免费精品久久 | 色图在线观看 | ,亚洲人成毛片在线播放 | 奇米精品一区二区三区在线观看 | 成人爱爱 | 欧美三级黄 | 午夜网| 日韩av成人在线观看 | 欧美怡红院视频 | 欧美一级大片在线观看 | jzzijzzij日本成熟少妇 | 爽爽视频在线观看 | 久久4| 欧美激情国产精品免费 | 亚洲高清自拍 | 国产精品一卡二卡在线观看 | 一级免费片| 国产精品一二三四区 | 中文字幕一区二区三区人妻电影 | 老司机深夜福利在线观看 | 日韩一区二区三区三四区视频在线观看 | 国产精品推荐 | 国产馆在线观看 | 狠狠婷婷| 国产成人一区二区三区免费看 | 亚洲性综合 | 黄色三级视频在线观看 | 91禁在线观看 | 久久久久久久精 | 91av一区 | 凹凸精品一区二区三区 | 成人无码精品1区2区3区免费看 | 免看黄大片aa | 欧美在线播放一区 | 国产激情视频一区 | 中文字幕 日韩有码 | 国产精品九九热 | 7777久久亚洲中文字幕 | 日韩女同互慰一区二区 | 1000部拍拍拍18勿入免费视频 | 日本一本不卡 | 日本理论片午伦夜理片在线观看 | 中文免费在线观看 | 成人va在线观看 |