2

.net モジュールの永続性のために NHibernate を使用するブラウンフィールド マルチユーザー アプリケーション (99% Delphi、1% .net) があります。私のアプリケーションでは、いくつかのエンティティにカテゴリを追加できます。1 つを選択して、それを使用しないことにした場合 (したがって、カテゴリを再度削除する場合)、NHibernate によってロードされ、セッションの第 1 レベルのキャッシュに残ります。ここで、他のユーザーがこのカテゴリを削除し、エンティティを保存しようとすると、読み込まれたオブジェクトがもう存在しないため、アプリケーションが例外をスローします。

私の質問: もう存在しないアイテムがキャッシュにロードされているかどうかを確認する方法はありますか? もしそうなら、キャッシュから存在しないエンティティを削除する方法はありますか?

エンティティをロードします (セッション キャッシュに追加されます) カテゴリを追加します (セッション キャッシュに追加されます) 他の誰かがデータベースからカテゴリを削除します。エンティティを保存すると、カテゴリがもう存在しないため、例外が発生します。

それはまだセッションキャッシュにあります。セッションのキャッシュから (自動的に) 削除できればいいのですが? キャッシュをクリーンアップして、もう存在しないオブジェクトを削除する方法はありますか?

よろしく、テッド

4

1 に答える 1

2

NHibernate には、少なくとも .NET を使用しない限り、自動的に実行するオプションはありませんISessionIStatelessSession一次キャッシュがないため、ロードに使用できますが、提供する他の多くの機能が失われISessionます。

ISession.Clear()セッション (第 1 レベル) キャッシュをクリアしたり、セッションISession.Evict()から特定のエンティティを削除したりするために呼び出すこともできますが、それは自動ではありません。

セッション オブジェクトを保持する期間はどれくらいですか? 別のセッション管理コンテキストが必要な場合があります。

セッションの存続期間が短い場合でも、エンティティ キャッシュを実現できますが、第 2 レベルのキャッシュを使用します。SysCache2は、 をサポートする第 2 レベルのキャッシュ プロバイダーの1 つですSqlCacheDependency。これは、データベース内の一部のオブジェクトが変更されたときにキャッシュの有効期限を設定できることを意味します。

于 2012-07-24T09:00:42.497 に答える