ああ、わかった!結局のところ、それはすべて第2レベルのキャッシュのせいではなく、QueryOverの使用が原因です。
マルチテナントSaaSアプリケーションを作成しているため、ほとんどのクエリは次のようになりました。
return
Session.QueryOver<Article>().Cacheable().
Where(a => a.Site == site && a.PublishedAt <= publishedAt).
OrderByCoalesceDesc(typeof(DateTime), a => a.UpdatedAt, a => a.CreatedAt).
Take(count).
Future();
そしてa.Site == site
問題でした。どうやら、クエリキャッシュがクエリ結果がキャッシュされているかどうかをチェックする方法は、基本的にSQLステートメントとすべてのパラメータの組み合わせをキャッシュ「ハッシュテーブル」のキーとして使用することです。SQLステートメントのテキストは、複数のクエリで常に同じですが、site
パラメータが原因でした。NHは、提供されたすべてのパラメーターが既にキャッシュにあるパラメーターと一致するかどうかを確認します。当然Equals()
、クラスには実装されていないSite
ため、確認は常に失敗しました。
最終的には、クエリを次のように書き直しました。
var siteID = site.ID;
return
Session.QueryOver<Article>().Cacheable().
Where(a => a.Site.ID == siteID && a.PublishedAt <= publishedAt)...