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

NHibernate 二級快取深度探索(下):查詢快取、快取管理與同步策略

     編輯:關於.NET

二級快取更新/刪除策略

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

更新資料後二級快取同步驗證

查詢快取

組態啟用:<property name="cache.use_query_cache">true</property>。NHibernate 建立兩個快取區域:StandardQueryCache(結果集)、UpdateTimestampsCache(資料表最後更新時間戳)。

查詢快取非永久有效:對應資料表異動時自動失效。預設關閉,需显式 IQuery.SetCacheable(true) 啟用。

範例 1:显式啟用查詢快取

var customers = session.CreateQuery("from Customer c where c.CustomerId > 2")
    .SetCacheable(true).List<Customer>();

查詢快取命中畫面

範例 2:指定命名快取區域

.SetCacheable(true).SetCacheRegion("queryCache")

第二次查詢若未指定或指定不同區域,將重查資料庫。

範例 3:命名查詢

在 .hbm.xml 定義:

<query cacheable="true" cache-mode="normal" name="selectCustomer">
from Customer
</query>

呼叫 session.GetNamedQuery("selectCustomer").List<Customer>(),第二次自動命中快取。

命名查詢快取結果

快取管理 API

ISessionFactory 提供 EvictXXX() 系列方法:

  • Evict(Type) / Evict(Type, id):移除類別所有/指定實例
  • EvictEntity(name) / EvictCollection(role) / EvictCollection(role, id)
  • EvictQueries() / EvictQueries(region):清除查詢快取

範例 4:程式化移除快取

sessionFactory.Evict(typeof(Customer));

第二次查詢因快取被清除,重查資料庫。

Evict 後重查資料庫

ISession 快取模式

CacheMode 控制 Session 與 Factory 交互:

模式行為
Ignore更新時使二級快取失效,其餘不交互
Put只寫不讀
Get只讀,更新時寫入
Normal預設,讀寫皆有
Refresh寫入不讀,配合 cache.use_minimal_puts 強制從 DB 刷新

範例 5:強制刷新快取區域

.SetCacheMode(CacheMode.Refresh)

Refresh 模式強制重查

結語

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

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved