緩存的作用主要用來提高性能,可以簡單的理解成一個Map;使用緩存涉及到三個操作:把數據放入緩存、從緩存中獲取數據、刪除緩存中的無效數據。
一、hibrnate內部緩存分析:
1、一級緩存:Session級別的緩存
特點:生命週期短、作用範圍小。隨着session的結束而結束!
缺陷:沒有任何的保護,不能存過多數據,否則緩存會溢出!共享範圍太小。
什麼時候將數據放入緩存?
答:save,update,saveOrUpdate,load,get,list,iterate,lock這些方法都會將對象放在一級緩存中
什麼時候從緩存中提取數據?
答:查詢的時候:get()、load()先去緩存中找,如果有直接返回;如果沒有則從數據庫中找。Criteria、query接口實現的查詢,不從緩存中提取數據
注:一級緩存不能控制緩存的數量,所以要注意大批量操作數據時可能造成內存溢出;可以用evict(清除一級緩存中的一個對象),clear(清除一級緩存中的所有對象)方法清除緩存中的內容。
2、二級緩存:sessionFactory級別緩存
·實現爲可插拔,通過修改cache.provider_class參數來改變;
hibernate內置了對EhCache,OSCache,TreeCache,SwarmCache的支持,可以通過實現CacheProvider和Cache接口來加入Hibernate不支持的緩存實現。
·在hibernate.cfg.xml中加入:
<class-cache class="className" usage="read-only"/>
或在映射文件的class元素加入子元素:
<cache usage="read-write"/>
其中usage:read-only,read-write,nonstrict-read-write,transactional。
在配置文件中配置二級緩存,主要高速hibrnae第三方緩存的提供者是誰。
(1) cache.use_second_level_cache:true決定要不要打開二級緩存打開,這個屬性的默認值就是true
(2)cache.provider_class:cache的提供者是誰
<property name="cache.provider_class">
org.hibernate.cache.OSCacheProvider
</property>
(3)需要將oscache相關的jar包構建到項目中
(4)需要將oscache.properties拷貝src目錄下
(5)方法一:在配置文件中<class-cache class=”com.hbsi.domain.User” usage=””>:告訴hibrnate哪些類是需要放入緩存的:
Usage: reade-only 效率高,但是有一個限制數據庫不能被修改、Read-writer、nonstruct-read-writer、transactional
方法二:在映射文件中<cache usage="read-write"/>告訴hibernate
命中:
錯過:
<property name=”gengerate_statisyics”>true</property>
對調是有很大的幫助,產生統計信息
在statistics st=session.getStatistics();//得到緩存統計信息
Statistics[
Start time=1324006095531,
sessions opened=0,
sessions closed=0,
transactions=0,
successful transactions=0,
optimistic lock failures=0,
flushes=0,
connections obtained=0,
statements prepared=0,
statements closed=0,
second level cache puts=0,
second level cache hits=0,
second level cache misses=0,
entities loaded=0,
entities updated=0,
entities inserted=0,
entities deleted=0,
entities fetched=0,
collections loaded=0,
collections updated=0,
collections removed=0,
collections recreated=0,
collections fetched=0,
queries executed to database=0,
query cache puts=0,
query cache hits=0,
query cache misses=0,
max query time=0
]