NHibernate で条件クエリを実行するとき、キャッシュから古い結果ではなく、新しい結果を取得したいと考えています。
プロセスは基本的に次のとおりです。
- 永続オブジェクトを NHibernate アプリケーションに照会します。
- データベース エントリを外部で変更します (別のプログラム、SSMS / MSSQL での手動編集など)。
- 持続性オブジェクトを照会します (同じ照会コードを使用)。以前にロードされたオブジェクトはデータベースからリフレッシュされます。
コードは次のとおりです (オブジェクト名が少し変更されています)。
public IOrder GetOrderByOrderId(int orderId)
{
...
IList result;
var query =
session.CreateCriteria(typeof(Order))
.SetFetchMode("Products", FetchMode.Eager)
.SetFetchMode("Customer", FetchMode.Eager)
.SetFetchMode("OrderItems", FetchMode.Eager)
.Add(Restrictions.Eq("OrderId", orderId));
query.SetCacheMode(CacheMode.Ignore);
query.SetCacheable(false);
result = query.List();
...
}
SetCacheMode と SetCacheable は、キャッシュを無効にするために私が追加しました。また、NHibernate ファクトリーは構成パラメーター UseQueryCache=false でセットアップされます。
Cfg.SetProperty(NHibernate.Cfg.Environment.UseQueryCache, "false");
Put/Refresh キャッシュ モードを含め、クエリまたはセッションに対して何をしても、NHibernate はクエリが 2 回目に呼び出されたときに、外部でコミットされた変更なしで古いオブジェクトを返し続けます。情報: この場合の古い値は、バージョン列の値です (保存する前に古いオブジェクトの状態を検出できるかどうかをテストするため)。しかし、複数の理由から、新しいクエリ結果が必要です!
Hibernate は SQL クエリを生成しますが、返される値には使用されません。
セッションを開いたままにしておくことは、ダーティ カラムに対してのみ動的な更新を行うために必要です (解決のためのステートレス セッションもありません!)。特にクエリが下位レベルにあり、以前にロードされたオブジェクトを覚えていないため、Clear()、Evict() などをコードのどこにでも追加したくありません。悲観的ロックはパフォーマンスを低下させます (マルチユーザー環境!)
不要なキャッシュ機能を使用せずに、構成によってNHibernateにクエリをDBに直接送信させ、新しい結果を取得させる方法はありますか?