hibernate的快取和快照 (轉載)
hibernate存在2個快取
第一級別的快取是 Session 級別的快取,它是屬於事務範圍的快取(session的一級快取)
第二級別的快取是 SessionFactory 級別的快取,它是屬於程序範圍的快取(二級快取
session的一級快取
使用hibernate進行查詢的時候,將查詢結果放置到session的一級快取中,在一級快取中存在物件,物件使用屬性的OID的值進行區分,此時再使用相同的OID進行查詢的時候,首先會在session一級快取中進行查詢是否存在相同的OID
- 如果存在相同的OID,此時不再查詢資料庫,而是直接使用一級快取中存在的物件
- 如果沒有存在相同的OID,此時再查詢資料庫,將查詢得到的結果資料再放置到session一級快取中
目的:減少訪問資料庫的次數
session的快照
使用id進行查詢資料庫,將查詢得到的結果放置到session一級快取中,同時複製一份資料,放置到session的快照中
當使用tr.commit()的時候,同時清理session的一級快取(flush)
當清理session一級快取的時候,會使用OID判斷一級快取中物件和快照中的物件進行比對
- 如果2個物件(一級快取的物件和快照的物件)中的屬性發生變化,則執行update語句,此時更新資料庫,更新成一級快取中的資料
- 如果2個物件中的屬性不發生變化,此時不執行update語句
目的:確保和資料庫中的資料一致
Session二級快取
一個可配置的快取外掛,包括類級別的快取區域,集合級別的快取區域,查詢級別的快取區域,時間戳級別的快取區域
其使用步驟大致如下:
1 拷貝ehcache-1.5.0.jar到當前工程的lib目錄下
2 開啟二級快取
<property name="hibernate.cache.use_second_level_cache">true</property>
3 要指定快取的供應商
<property name="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider</property>
4 指定使用二級快取的類
方法一 在使用類的*.hbm.xml配置
選擇需要使用二級快取的持久化類, 設定它的二級快取的併發訪問策略, <class> 元素的 cache 子元素表明 Hibernate 會快取物件的簡單屬性, 但不會快取集合屬性, 若希望快取集合屬性中的元素, 必須在 <set> 元素中加入 <cache> 子元素
方法二 在hibernate.cfg.xml檔案中配置(建議)
<!-- 指定使用二級快取的類放在maping下面 -->
<!-- 配置類級別的二級快取 -->
<class-cache class="cn.itcast.c3p0.Customer" usage="read-write"/>
<class-cache class="cn.itcast.c3p0.Order" usage="read-write"/>
<!-- 配置集合級別的二級快取 -->
<collection-cache collection="cn.itcast.c3p0.Customer.orders"
usage="read-write"/>
5 配置ehcache預設的配置檔案ehcache.xml(名字固定)(放在類路徑下)
hibernate中一級快取、快照、二級快取面試的時候問得比較多。