首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Hibernate 3 學習筆記(二十一):二級快取完整指南

     編輯:Java 相關知識

什麼是二級快取?

二級快取屬於 **SessionFactory 級別**,跨越多個 Session 生命週期。當同一個 SessionFactory 下的不同 Session 請求相同資料時,第二個 Session 可直接從二級快取取得,無須查詢資料庫,大幅提升高併發場景下的讀取效能。

啟用二級快取的三步驟

1. 選擇快取提供者並修改 hibernate.cfg.xml

Hibernate 內建 HashtableCacheProvider 僅供測試,生產環境建議使用 **Ehcache**。

<property name="hibernate.cache.provider_class">
    org.hibernate.cache.EhCacheProvider
</property>

需額外引入 ehcache.jar。

2. 在映射檔聲明實體可被快取

在 User.hbm.xml 的 <class> 標籤下加入:

<cache usage="read-write"/>

usage 四種策略:

  • read-only:唯讀,效能最好,適合參考資料。
  • read-write:讀寫,支援交易,最常用。
  • nonstrict-read-write:非嚴格讀寫,偶爾更新,不保證強一致性。
  • transactional:全交易型,需 JTA 環境,僅特定提供者支援。
不同快取提供者支援的策略不同,請參閱官方文件對照表。

3. 提供 Ehcache 設定檔 (ehcache.xml)

放在 classpath 根目錄:

<ehcache>
    <diskStore path="java.io.tmpdir"/>
    <defaultCache
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        overflowToDisk="true"
    />
</ehcache>

實戰驗證:跨 Session 共享快取

Session session1 = sessionFactory.openSession();
User user1 = (User) session1.load(User.class, 1);
user1.getName(); // 觸發載入
session1.close();

Session session2 = sessionFactory.openSession(); // 新 Session
User user2 = (User) session2.load(User.class, 1); // 直接從二級快取取得
user2.getName();
session2.close();

無二級快取時: 兩次 load 皆發出 select ... from user where id=?。
啟用後: 第二次 load **零 SQL**,直接回傳快取物件。

手動清除二級快取

當資料經由外部系統異動,或需強制刷新時,可呼叫:

sessionFactory.evict(User.class, userId);      // 清除特定實體
sessionFactory.evict(User.class);              // 清除整個實體類別
sessionFactory.evictCollection("User.emails"); // 清除集合快取

關鍵提醒

  1. 二級快取快取的是**實體的「脫管狀態」資料**(識別值 + 屬性值),而非實體物件本身。
  2. 集合快取需在映射檔的 <set>/<list> 等標籤上另行加入 <cache usage="..."/>。
  3. 查詢快取與二級快取配合使用效果最佳:Query Cache 存 ID,二級快取存實體資料。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved