2011-08-11 9 views
0

私はSysCache2とNHibernate 2.1.2.4を使用しています。NHibernateは、第2レベルのキャッシュが更新されたときにエンティティを削除しないのはなぜですか?

NHibernateは、どれほど難しいかにかかわらず、エンティティの前のインスタンスをロードし続けます。

私のクラスはキャッシュ可能なReadWriteとしてマップされています。

キャッシュ領域がデフォルトです。つまり、クラスのタイプの完全な名前です。

トランザクション内ですべての操作を実行しています。

データベースが確実に更新されているため、ASP .NETのキャッシュを手動で消去すると、問題は解決しません。

私はこのように、簡単な更新をしています:

using(var transaction = NHSession.BeginTransaction()) 
{ 
    var foo = Session.Load<Foo>(_fooId); 

    foo.Name = "A new name"; 

    transaction.Commit(); 
} 

をそれから私はこのように、(アプリケーション内の別のセッションで)後にエンティティをリロード:

using(var transaction = NHSession.BeginTransaction()) 
{ 
    var foo = Session.Load<Foo>(_fooId); 

    Response.Write(foo.Name); 

    transaction.Commit(); 
} 

..しかし、フーの名前はまだ古い名前ではなく、私はそれを更新した新しい名前ではありません!

答えて

1

私はこの問題を解決しました。何らかの理由で2つのセッションファクトリがありました。 1つのファクトリ内で保存操作が実行されていて、他のファクトリで負荷が発生していたことに気付かなかった。

1

キャッシュに関するすべてのメッセージをログに記録し、2番目のトランザクションがコミットされたときにキャッシュが更新されるかどうかを確認します。以下は、ログメッセージをログに記録するlog4netの設定例です。

<logger name="NHibernate.Cache.ReadWriteCache" additivity="false"> 
    <level value="ALL"/> 
    <appender-ref ref="Console"/> 
</logger> 

+0

こんにちは、私はログをチェックして、エンティティが更新されると無効にされていません。 – cbp

0

なぜGetの代わりにLoadを使用していますか?私はこれが問題と関係していると考えています。 This articleは違いを説明していますが、問題に固有のものは何も関係していません。それでも、私はGetに切り替えようとします。

+0

私はそれが問題になる可能性は理解していません - ロードはプロキシをロードするだけですが、Getはエンティティ全体をすぐに取得します。それ以外は、キャッシングにどのように関連しているのかわかりません。 – cbp

+0

Getは第1レベルと第2レベルのキャッシュをチェックします。大きな違いは、Loadではnullが返されないことです。エンティティが存在しない場合、getはnullを返します。プロパティをロードしてから、ID以外のプロパティにすぐにアクセスするのは意味がありません。私の推測では、実際のエンティティではなくプロキシを更新しているので、キャッシュされたエンティティは更新されません。 –

+0

私はそれが理にかなっているとは思わない - プロキシのプロパティを設定するとすぐに、それ自体がプロキシ解除されるべきである。 – cbp

関連する問題