3

NHibernateマルチクエリ機能を広範囲に使用しており、奇妙な動作を経験しています。NHibernateはマルチクエリをキャッシュせず、常にデータベースにアクセスするようです。QueryOverを使用しており、すべてのクエリがキャッシュ可能に設定されていますが、パターンを使用してblitz.ioでホームページをテスト-p 1-250:30すると、データベースにヒットする唯一のマルチクエリが2000回以上実行されるのに対し、他のクエリ(現在サインインしているユーザー)は、1回または2回だけ実行されます。

だから問題は:私は何かが足りないのか、それともNHibernateは実際にはマルチクエリの結果をキャッシュしないのか?

4

1 に答える 1

4

ああ、わかった!結局のところ、それはすべて第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)...
于 2011-09-08T08:16:23.550 に答える