2

次のエラーに関する多くの問題に気付いた Web アプリケーションがあります。

NHibernate.Cache.ReadWriteCache - An item was expired by the cache while it was locked (increase your cache timeout)

これらの行の後には、DB に永続化されるはずのランダムなエンティティが続きます。時折、これらが永続化に失敗したり、設定されるべき特定のフィールドが不足しているように見えたりして、大きな頭痛の種になります。

最も奇妙なことは、第 2 レベルのキャッシュがオフになっている場合でもこれが表示されることです。これには驚かされます。これが実行されているサーバーには 64 GB の RAM があり、使用量は通常 55 ~ 60 GB 程度です。これは複数のサイトをホストしているためです。

第 2 レベルのキャッシュがオフになっているはずなのに、なぜこれが表示されるのですか? 一次キャッシュはこのように期限切れになるべきではありませんよね? また、特定のエンティティに対して期限切れにならないように CachePriority を設定しようとしましたが、それでもログに表示されます。

私は何を間違っていますか?私は誤解されていますか?

4

1 に答える 1

2

読み取り/書き込みキャッシュが有効になっているが、構成で第 2 レベルのキャッシュ プロバイダーが設定されていないエンティティに対して同じメッセージが表示されました。

NH 構成ファイルでプロバイダーを設定するだけで、そのプロバイダーのクエリと第 2 レベルのキャッシュが無効になっている (use_second_level_cache = off、use_query_cache = off) 場合でも、そのメッセージを取り除くことができました。

memcache を使用します。これは、第 2 レベルのキャッシュを必要とせず、同時にログ メッセージを回避する場合の NH 構成ファイルの外観です。

<property name="cache.provider_class">NHibernate.Caches.MemCache.MemCacheProvider,NHibernate.Caches.MemCache</property>
<property name="cache.use_second_level_cache">false</property>
<property name="cache.use_query_cache">false</property>
于 2014-10-04T17:53:13.743 に答える