4

セッションキャッシュに特定のタイプのオブジェクトが多すぎる場合に、ある種のコンソール警告を生成するようにHibernateに指示する方法があるかどうか疑問に思いました。OutOfMemoryExceptionOracleからのBLOBのロードで問題が発生することがあるため、負荷テストのためにこれを実行したいと思います。

今のところまだ使っHibernate 3.6.10ています。現時点でのこのテストの最善のアプローチは、システムが通常のユースケースで処理できるよりも多くのデータを生成し、親オブジェクトをロードしてクラッシュするかどうかを確認することです。このようにするのはちょっと気分が悪いです。

どんな提案でも大歓迎です。

私が言及するのを忘れた1つの注意点は、この「ロギング」のアイデアは、特定の問題を特定するために本番コードに残したいものであるということです。

- 編集 -

これが私がやろうとしていることの例です:

オブジェクト@Entity ClassXの遅延ロードリストがあるとしましょう。どういうわけか、100個以上のインスタンスがセッションキャッシュにロードされ@Entity ClassYたときにログメッセージを吐き出してもらいたいのですが。ClassYこのようにして、開発中にオブジェクトをロードして、ClassX自分(またはチームの他の開発者)がアクセスしてはいけないときにそのリストにアクセスしているかどうかを確認できます。

4

1 に答える 1

1

オブジェクトの読み込みイベントをリッスンするためにをアタッチしInterceptorて、一意のエンティティタイプごとにカウントを維持し、特定のしきい値を超えるたびに警告をログに記録することができます。ドキュメントには、セッションスコープのインターセプターを作成時に渡すことで定義する方法が示されています。

Session session = sf.openSession( new AuditInterceptor() );

ほとんどの場合、セッションを手動で作成していないため、これは役に立たない可能性がありますが、セッションを宣言する方法には、何らかの方法で通過する方法がありますInterceptor

SessionFactoryスコープのインターセプターを宣言する方が簡単ですが、オブジェクトが作成されているセッションへの参照を返すようには見えません。そうしないと、WeakHashMap(Sessionを使用して)で何らかのカウンターをノックアップできます。メモリをリークしないようにするためのキーとして)。デフォルトのスレッドローカルセッション戦略を使用している場合は、いつでも質問できますsessionFactory.getCurrentSession()

于 2013-03-12T20:03:00.440 に答える