核心概念釐清
- PO (Persistent Object):持久化物件,對應資料庫實體記錄的物件表示。
- VO (Value Object):值物件/業務物件,承載業務數據傳輸。
- FormBean:表單封裝類,弱化控制層對
HttpServletRequest 的直接依賴。
Jive 緩存策略
運作流程
- 條件查詢:先執行
SELECT id FROM table WHERE ... 取得 ID 列表。
- 逐筆獲取:遍歷 ID 列表,優先查緩存;未命中則發
SELECT * FROM table WHERE id = ? 查庫,並將結果放入緩存。
- ID 查詢:同步驟 2,先查緩存再查庫。
- 寫操作:增刪改同步更新緩存。
優缺點分析
| 優點 | 缺點 |
- ID 查詢命中緩存時省去一次 DB 查詢。
- 多次條件查詢結果集有交集時,交集部分避免重複查庫。
|
- 條件查詢首次
SELECT id 必不可少。
- 最壞情況(緩存全未命中)需 n+1 次查詢(n 為 ID 數量)。
|
Hibernate 二級緩存策略
運作流程
- 條件查詢:直接發
SELECT * FROM table WHERE ... 一次性取回所有欄位。
- 填充緩存:將結果按 ID 放入二級緩存。
- ID 查詢:一級緩存 → 二級緩存 → 資料庫,層層遞進。
- 寫操作:同步更新緩存。
優缺點分析
| 優點 | 缺點 |
- 同享 Jive 的 ID 查詢緩存優勢。
- 無「n+1 查詢」最壞情況,條件查詢固定 1 次。
|
- 條件查詢必須全表掃描所有欄位,較
SELECT id 耗時耗空間。
- 即使目標記錄已在緩存,條件查詢仍會完整從 DB 取出,無法像 Jive 那樣利用交集優化。
|
Hibernate Query Cache(查詢緩存)
專為條件查詢設計,鍵值為 Query Key(SQL + 參數 + 分頁資訊)。
運作機制
- 依 Query Key 查緩存,命中直接返回結果列表。
- 未命中則查庫,將完整結果列表存入緩存。
- 相關表異動時,清除所有包含該表的 Query Key。
優缺點
- 優點:條件查詢命中時零資料庫查詢。
- 缺點:
- 表級失效粒度粗:任一記錄變更導致所有相關 Query Key 失效。
- 結果列表重複存儲:不同 Query Key 的交集物件在緩存中存在多份副本。
二級緩存與 Query Cache 同步困境
兩者獨立運作,無自動同步機制。Query Cache 存的是物件列表(含完整屬性),二級緩存存的是按 ID 索引的物件。當表異動時,Hibernate 直接清除 Query Key,避開同步複雜度,但也意味著 Query Cache 命中率極易受寫操作影響。
選型建議
| 場景 | 推薦策略 |
| 讀多寫少、ID 查詢為主 | 二級緩存 |
| 固定條件查詢頻繁、結果集穩定 | Query Cache |
| 高併發寫入、數據頻繁變更 | 謹慎啟用 Query Cache,或縮短失效時間 |
| 需精確控制緩存粒度 | 自定義緩存策略(如 Redis + 應用層邏輯) |