啟用讀寫策略時,修改資料並提交,NHibernate 執行 UPDATE 並同步更新二級快取。第二次讀取同一資料,從二級快取取得已更新的資料。刪除/新增同理。

組態啟用:<property name="cache.use_query_cache">true</property>。NHibernate 建立兩個快取區域:StandardQueryCache(結果集)、UpdateTimestampsCache(資料表最後更新時間戳)。
查詢快取非永久有效:對應資料表異動時自動失效。預設關閉,需显式 IQuery.SetCacheable(true) 啟用。
var customers = session.CreateQuery("from Customer c where c.CustomerId > 2")
.SetCacheable(true).List<Customer>();

.SetCacheable(true).SetCacheRegion("queryCache")
第二次查詢若未指定或指定不同區域,將重查資料庫。
在 .hbm.xml 定義:
<query cacheable="true" cache-mode="normal" name="selectCustomer">
from Customer
</query>
呼叫 session.GetNamedQuery("selectCustomer").List<Customer>(),第二次自動命中快取。

ISessionFactory 提供 EvictXXX() 系列方法:
Evict(Type) / Evict(Type, id):移除類別所有/指定實例EvictEntity(name) / EvictCollection(role) / EvictCollection(role, id)EvictQueries() / EvictQueries(region):清除查詢快取sessionFactory.Evict(typeof(Customer));
第二次查詢因快取被清除,重查資料庫。

CacheMode 控制 Session 與 Factory 交互:
| 模式 | 行為 |
|---|---|
| Ignore | 更新時使二級快取失效,其餘不交互 |
| Put | 只寫不讀 |
| Get | 只讀,更新時寫入 |
| Normal | 預設,讀寫皆有 |
| Refresh | 寫入不讀,配合 cache.use_minimal_puts 強制從 DB 刷新 |
.SetCacheMode(CacheMode.Refresh)

合理運用二級快取與查詢快取,可大幅提升效能。關鍵在於選對並發策略、適時管理快取失效。