3

NHibernate を使用してマップされ、第 2 レベルのキャッシュ (memcached) にキャッシュされているクラス「Company」があります。私たちのチームは最近、データベースに保存される新しい bool プロパティをこのクラスに追加しました。

開発環境ではすべて問題なく動作しましたが、ステージング環境 (ライブ データベースを共有) に展開するとすぐに、次のエラーが発生し始めました。

System.IndexOutOfRangeException: Index was outside the bounds of the array.
at (Object , Object[] , SetterCallback )
at NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValuesWithOptimizer(Object entity, Object[] values)
at NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValues(Object entity, Object[] values)
at NHibernate.Persister.Entity.AbstractEntityPersister.SetPropertyValues(Object obj, Object[] values, EntityMode entityMode)
at NHibernate.Cache.Entry.CacheEntry.Assemble(Object[] values, Object result, Object id, IEntityPersister persister, IInterceptor interceptor, ISessionImplementor session)
at NHibernate.Cache.Entry.CacheEntry.Assemble(Object instance, Object id, IEntityPersister persister, IInterceptor interceptor, ISessionImplementor session)
at NHibernate.Event.Default.DefaultLoadEventListener.AssembleCacheEntry(CacheEntry entry, Object id, IEntityPersister persister, LoadEvent event)
at NHibernate.Event.Default.DefaultLoadEventListener.LoadFromSecondLevelCache(LoadEvent event, IEntityPersister persister, LoadType options)
at NHibernate.Event.Default.DefaultLoadEventListener.DoLoad(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options)

私の推測では、NHibernate は古いキャッシュ エントリ (新しいプロパティを持たない) を新しい Company オブジェクトに逆シリアル化できないということです。ステージング環境で第 2 レベルのキャッシュを無効にし、ISE が停止したため、これを確認したと思います。

私の質問は、NHibernate が例外をバブルアップする代わりにキャッシュ エントリをデシリアライズできない場合、どうすれば NHibernate をデータベースにフォールスルーさせることができるのでしょうか? 他の誰かがこの問題に遭遇しましたか?

現時点では、第 2 レベルのキャッシュをオフにしてデプロイし、memcached サーバーを再起動してから、第 2 レベルのキャッシュを再度有効にする必要があると思います。ただし、このソリューションは理想的ではありません。誰かがより良い提案を持っているなら、私はとても感謝しています.

4

3 に答える 3

0

興味のある方への最新情報として、投稿で概説されている手順に従いました。

[...] 第 2 レベルのキャッシュをオフにしてデプロイし、memcached サーバーを再起動してから、第 2 レベルのキャッシュを再度有効にする必要があります。

...そして、すべてうまくいきました。通常のデプロイよりも少し複雑でしたが、エラーはありませんでした。

于 2012-06-04T14:30:10.907 に答える
0

2 番目のレベルのキャッシュをオフにして再起動するなど、必要のないことをすべて実行します。あなたが実際に行っていることは、キャッシュ内のアイテムを無効にして、nhibernate をデータベースに移動させることだけだと思います。

memcached に関連する gem が見つかった場合 - telnet インターフェースからキャッシュをフラッシュすることで、キャッシュ全体を無効にすることができます。

telnet SomeServerInCluster 11211
flush_all

すべての memcached マシンを再起動することで、目的を達成できました。

http://www.lzone.de/articles/memcached.htm

于 2013-07-26T17:58:10.633 に答える