1

社内アプリケーションに既にキャッシュされているデータベース内の 1 つまたは複数のビジネス エンティティを変更する作業を頻繁に行うことがあります。アプリ プールを循環させずにアプリケーションにこれらの変更を反映させるために、開発者/管理者がアプリの UI 内から (完全にまたは特定のオブジェクトに対して) キャッシュを削除する機能を組み込むことを考えましたが、次のコメントに気付きました。メソッドは次のように述べています...

/// <summary>
/// Evict an entry from the process-level cache.  This method occurs outside
///     of any transaction; it performs an immediate "hard" remove, so does not respect
///     any transaction isolation semantics of the usage strategy.  Use with care.
/// </summary>
void ISessionFactory.Evict(Type persistentClass, object id);

それは正確にはどういう意味ですか?トランザクションに関与している可能性のある 1 つまたは複数のオブジェクトを削除しようとすると、何が問題になる可能性がありますか? また、それらが破壊的な場合、これらの副作用を回避する方法はありますか? 私は現在 SysCache2 を使用しており、SqlDependency の使用方法に関する実装の詳細を探していますが、当面の Evict 効果についてはまだ興味があります。

更新:コメントをよく見ると、プロセス レベルのキャッシュから削除し、2 番目のレベルのキャッシュから削除するようにSessionFactory.Evict()見えSessionFactory.EvictCollection()ますSessionFactory.EvictEntity()。ただし、どちらのフレーバーにも同じ免責事項があります。だから私の最初の質問はまだ残っています。別のトランザクションで現在使用されているエンティティをキャッシュ (プロセスまたは第 2 レベル) から削除すると、どのような危険がありますか?

4

1 に答える 1

0

Evict はエンティティをセッションから切り離します。

private static Book CreateAndSaveBook(ISessionFactory sessionFactory)
{
    var book = new Book()
    {
        Name = "Book1",
    };

  using (var session = sessionFactory.OpenSession())
  {
    using (var tx = session.BeginTransaction())
    {
         session.Save(book);
         tx.Commit();
         session.Evict(book);
    }
  }
 return book;
}

CreateAndSaveBook では、ブックを作成してデータベースに保存します。トランザクションをコミットし、本をセッションから追い出し、セッションを閉じ、本を返します。これが私たちの問題を設定します。セッションのないエンティティができました。このエンティティへの変更は追跡されていません。ごく普通の本のオブジェクトです。

book オブジェクトを引き続き変更し、これらの変更を保存します。NHibernate は、この本に対して何を行ったかを知りません。大規模なアプリケーションの他のレイヤーまたは層を通過した可能性があります。どのセッションに関連付けられているかはわかりません。その本がデータベースに存在するかどうかさえ分からないかもしれません。

于 2013-01-25T06:36:19.467 に答える