1、Hibernate緩存策略概述數據庫
什麼是緩存?緩存
緩存是指爲了下降應用程序對物理數據源訪問的頻次,從而提升應用程序的運行性能的一種策略服務器
爲何使用緩存?session
ORM框架訪問數據庫的效率直接影響應用程序的運行速度,提高和優化ORM框架的執行效率相當重要併發
Hibernate的緩存是提高和優化Hibernate執行效率的重要手段,因此學會Hibernate緩存的使用和配置是優化的關鍵框架
2、Hibernate緩存策略——不使用緩存的問題ide
觀察如圖代碼IO,發現了什麼?性能
1.Hibernate緩存與session相關,同一個session第二次訪問同一個對象將使用緩存。優化
2.在不一樣的session中屢次查詢同一個對象時,會執行屢次數據庫查詢。spa
3.在一級緩存當中,持久化類的每一個實例都具備惟一的OID,也就是說同一個session兩次查一個對象時,第二次是不會再將對象保存在緩存當中的。
3、一級緩存介紹
介紹Hibernate一級緩存:
1.Hibernate一級緩存又稱爲"Session緩存","會話級緩存"
2.經過Session從數據庫查詢實體時把實體在內存中存儲起來,下一次查詢同一實體時再也不從數據庫獲取,而是從內存中獲取,這就是緩存
3.一級緩存的生命週期和Session相同;Session銷燬,他也銷燬
4.一級緩存中的數據可適用範圍在當前會話以內
Hibernate一級緩存的API
1.一級緩存沒法取消,Hibernate默認使用一級緩存
2.用兩個方法管理一級緩存:
a.evict():用於將某個對象從Session的一級緩存中清除
b.clear():用於將一級緩存中的全部對象所有清除
3.一級緩存也有些時候會對程序的性能產生影響,由於在對數據庫進行增刪改的時候同時也要更新緩存
一級緩存注意問題:
1.query.list()是不會使用一級緩存的
2.query.iterate()會使用一級緩存,當緩存中有數據的時候,query.iterate()將全部對象的id查詢出來而後到緩存中將全部對象都查詢出來,若是緩存中沒有數據,query.iterate()則把對象從數據庫中一條一條的將數據查出來
4、二級緩存應用
二級緩存的配置步驟:
一、添加二級緩存對應的jar包(commons-logging-1.1.3.jar ; ehcache.jar.zip)
二、在Hibernate的配置文件中添加Provider類的描述
三、添加二級緩存的屬性配置文件(ehcache.xml)
四、在須要被緩存的表所對應的映射文件中添加<cache/>標籤
region="Employee(自定義命名)":
在ehcache.xml文件中自定義配置:
maxElementsInMemory="10000" 表示緩存中容許建立的最大對象數。
eternal="false" 表示緩存中對象是否爲永久的。
timeToIdleSeconds="120" 表示緩存數據鈍化時間(即對象在它過時前的空閒時間)。
timeToLiveSeconds="120" 表示緩存數據生存時間(即對象在它過時前的生存時間)。
overflowToDisk="true" 表示溢出以後是否存儲在硬盤上。
Hibernate4之後的配置:
<!-- 配置二級緩存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
5、一二級緩存對比及總結
二級緩存的介紹
二級緩存又稱爲「全局緩存」、「應用級緩存」
二級緩存中的數據可適用範圍是當前應用中的全部會話
二級緩存是可插拔式緩存,默認是EHCache,還支持其餘二級緩存組件如:Hashtable、OSCache、SwarmCache、JBoss TreeCache等
一般會將一下特徵的數據放入到二級緩存中
不多被修改的數據
不是很重要的數據,容許偶爾併發的數據
不會被併發訪問的數據
參考數據
總結:
一、Hibernate的緩存能提升檢索效率
二、Hibernate的緩存分爲一級緩存和二級緩存。一級緩存是會話級緩存,二級緩存是應用級緩存
三、Hibernate的緩存在提升檢索的同時,也會增長服務器的消耗,因此要注意緩存的使用策略