Hibernate的緩存技術詳解,hibernate緩存詳解
轉載注明出處:http://www.cnblogs.com/xiaoming0601/p/5882980.html
一、什麼是緩存:
並不是指計算機的內存或者CPU的一二級緩存;緩存是指為了降低應用程序對物理數據源訪問的頻次從而提高應用程序的運行性能的一種策略。
二、為什麼使用緩存:
1.ORM框架訪問數據庫的效率直接影響應用程序的運行速度,提升和優化ORM框架的執行效率至關重要。
2.Hibernate的緩存是提升和優化Hibernate執行效率的重要手段,所以學會Hibernate緩存的使用和配置是優化的關鍵。
3.評判一個ORM框架是否優秀,訪問數據庫的頻次就一個重要的標准。
三、介紹一級緩存:
1.Hibernate一級緩存又稱為"Session緩存","會話級緩存"
2.通過Session從數據庫查詢實體時把實體在內存中存儲起來,下一次查詢同一實體時不再從數據庫獲取,而是從內存中獲取,這就是緩存
3.一級緩存的生命周期和Session相同;Session銷毀,他也銷毀
4.一級緩存中的數據可適用范圍在當前會話之內
四、Hibernate一級緩存API:
一級緩存是Hibernate的默認緩存,無法取消,用兩個方法管理:
1、evict():用於將某個對象從Session的一級緩存中清除。
2、clear():用於將一級緩存中的所有對象全部清除。
五.query.list()和query.iterator()方法的區別:
1.list每次都是通過一條語句直接操作數據庫取出所有的數據返回(並且將對象存入hibernate緩存),在一個session中使用兩次list()方法,都會發送查詢語句,證明list()方法不使用緩存;
2.iterator首先通過一條語句取出所有數據的id,然後通過id在hibernate的一級緩存中查找是否存在該對象,如果存在則直接取出,如果沒有則再次發出一條sql語句通過id取得對象(並且加入到緩存中),這樣如果所有的id在緩存中都沒有的話就會出現n+1條sql語句的問題。
3.所以兩者需要合理的結合使用,最大提高性能。
4.使用list()後,數據在一級緩存中存在,再同一個session中使用iterator()的話,不會發送數據庫語句,證明iterator()使用一級緩存,在一個session中使用兩次list()方法,都會發送查詢語句,證明list()方法不使用緩存
六.二級緩存的介紹
1.二級緩存又稱為“全局緩存”、“應用級緩存”;
2.二級緩存中的數據可使用范圍是當前應用的所有會話;
3.二級緩存是可插拔式緩存,默認是EHCache,還支持其他二級緩存組件如:HashTable、OSCache、SwarmCache等。
七.二級緩存(每個session共用的緩存)
1.每個session共用的緩存
2.二級緩存不是默認開啟的,需要手動配置
a.導入jar包
b.加入ehcache.xml配置文件
maxElementsInMemory="10000" 表示緩存中允許創建的最大對象數。
eternal="false" 表示緩存中對象是否為永久的。
timeToIdleSeconds="120" 表示緩存數據鈍化時間(即對象在它過期前的空閒時間)。
timeToLiveSeconds="120" 表示緩存數據生存時間(即對象在它過期前的生存時間)。
overflowToDisk="true" 表示溢出之後是否存儲在硬盤上。
c.hibernate.cfg.xml中配置指定二級緩存的外部實現類
d.xx.hbm.xml配置文件中配置指定使用二級緩存
<cache usage="read-only" region="Employee(自定義命名)"/>只讀
(region="Employee(自定義命名)":在ehcache.xml文件中自定義配置)
八.通常具有以下特征的數據放入二級緩存
1.很少被修改的數據;
2.不是很重要的數據,允許偶爾出現並發的數據;
3.不會被並發訪問的數據;
4.參考數據
九.一二級緩存的對比
十.總結
1.Hibernate的緩存能提高檢索效率;
2.Hibernate的緩存分為一級緩存和二級緩存,一級緩存是會話級緩存,二級緩存是應用級緩存;
3.Hibernate的緩存在提高檢索的同時,也會增加服務器的消耗,所以注意緩存的使用策略。