Hibernate 提供兩級緩存機制:一級緩存(Session 級,事務範圍)由框架自動管理;二級緩存(SessionFactory 級,進程/集群範圍)可配置、可插拔,是性能優化關鍵。本文系統梳理二級緩存核心概念、策略選型、適用場景及最佳實踐。
| 維度 | 一級緩存 | 二級緩存 |
|---|---|---|
| 作用域 | 事務 | 進程/集群 |
| 併發控制 | 無需(事務隔離) | 需配置策略 |
| 過期策略 | 無(顯式清理) | 基於內存/磁盤,可配置 |
| 存儲介質 | 內存 | 內存+磁盤 |
| 啟用方式 | 自動 | 類/集合粒度配置 |
適合: 很少修改、非關鍵允許臟讀、無併發訪問、參考數據(如字典表)
不適合: 頻繁修改、財務數據、多應用共享數據
執行 bulkUpdate("update Order set owner=? where id in (?,?,?)") 會清除所有 Order 實體緩存,因無法精確識別受影響實例。建議: 改用 session.update() 逐條操作,配合 JDBC 批處理發送,性能損失可控。
session.setCacheMode(CacheMode.IGNORE);
避免大量對象湧入緩存導致 OOM 和 GC 風暴。
針對條件查詢,Hibernate 提供 Query Cache,但實際效果有限,需謹慎評估。
二級緩存是雙刃劍:正確配置策略、選擇插件、理解清理機制,能顯著提升讀密集型應用性能;濫用或誤配則引入一致性風險與性能陷阱。企業應用首選 read-write + EhCache/JBoss Cache,配合 ID 級精確操作最大化收益。