首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Hibernate 快取機制:外部修改資料庫能否被 Session 感知?

     編輯:程式設計綜合問答

不能。 Hibernate 一級快取 和二級快取 皆駐留在 JVM 記憶體,與資料庫無即時同步機制。

快取架構圖解

graph TD
    App[應用程式] --> L1[一級快取\n(Session 級\n生命週期=Transaction)]
    App --> L2[二級快取\n(SessionFactory 級\n跨 Session 共享)]
    L1 --> DB[(資料庫)]
    L2 --> DB
    Ext[外部工具\nSQL Client/ETL] --> DB

情境模擬

  1. Session A 讀取 ID=1 實體 → 放入一級快取。
  2. DBA 直接下 `UPDATE ... SET name='X' WHERE id=1`。
  3. Session A 再次 `session.get(Entity.class, 1)` → 回傳快取內舊資料(name 仍為舊值)。

解決策略

策略適用場景實作方式
版本欄位樂觀鎖併發修改少、需防丟失更新@Version 欄位,自動比對版本號
手動 evict/refresh關鍵業務必須最新session.evict(entity); session.refresh(entity);
二級快取設定超時/過期可容忍秒級延遲Ehcache/Infinispan 設定 timeToLiveSeconds
資料庫觸發器 + 通知機制極高一致性需求PG NOTIFY / SQL Server Service Broker → 應用監聽並清快取
旁路快取唯讀/極少寫入唯讀查詢直接走快取,寫入同步更新快取

最佳實務建議

  • 預設啟用樂觀鎖(@Version),資料庫層面最後防線。
  • 核心交易(金流、庫存)在寫入前 `session.lock(entity, LockMode.PESSIMISTIC_WRITE)`。
  • 二級快取僅用於極少變動、高頻讀取的參考資料(字典、配置、國家代碼)。
  • 監控快取命中率,命中率 < 80% 應檢視策略。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved