Hibernate 4.0にアップデートしたところ、警告メッセージが表示されます。
HHH000387: ResultSet's statement was not registered
私のログファイルで。これはどういう意味ですか、心配する必要がありますか?
あまり心配しません。いずれにせよ、このメッセージを回避することはAPIのユーザーの手に渡っていないようです。ロギングはorg.hibernate.engine.jdbc.internal.JdbcResourceRegistryImplで行われます。によると ドキュメント :
JdbcResourceRegistryの主な機能は、リソースが確実にクリーンアップされるようにすることです。
コードをざっと見てみると、そのようなメッセージは次の2つの状況でログに記録されます。
このログメッセージは、ResultSet.getStatement()
が元々Statement
の作成を要求されたResultSet
を返さないことを示しています。 (これは、メモリリークを示している場合もあります。)これは、JDBCラッパーを使用している場合に発生する可能性があります。これは、ラッパー/デコレータと基になるStatement
の2つのStatement
オブジェクトがあるためです。
私のプロジェクトには、テスト用の独自のJDBCラッパーがあります。 ResultSet
ラッパーでこの警告を修正しました。これは、基になるStatement
(基になるResultSet
を返す)に委任するのではなく、getStatement()
が元のStatement
プロキシ(not新しいプロキシ)を返すようにすることでした__変数__)。
同様の警告を生成しているJDBCラッパーは、おそらく同様の修正を使用できます。 (同様の問題と修正がメソッドStatement.getConnection()
に適用される場合があります。)
ちなみに、このロギングのバグレポートはここにあります: https://hibernate.atlassian.net/browse/HHH-821
このエラーをスローするJdbcResourceRegistryImpl
クラスのソースを見ると、個人的には、WARNレベルでログを記録するのは過剰だと思います。すべてのStatement
をHibernate /フレームワーク構成の一部として暗黙的に登録する方法がない限り、最大でINFOである必要があります。
Statement
を登録する必要がある理由は私にはわかりませんが、Hibernateの内部動作のみが問題である場合は、APIユーザーに定期的に警告するのはバグですよね?
接続プールを構成しましたか?同じ警告が表示されます。しかし、Mavenの依存関係にc3p0を追加し、hibernate.cfg.xmlで正しく構成した場合。警告が消えます。
私の場合、この警告はパフォーマンスの大幅なリークを示していました。 @oneToOneマッピングを使用して休止状態のPOJOオブジェクトがあります。 1つのテーブルに対しては正常に機能し、警告はありません。すべてのレコードを取得するためにMySQlサーバーに1つのリクエストを送信し、次に結合されたテーブルごとに1つのリクエストを送信します。このエラーが発生するPOJOの場合(@oneToOneが見つからない場合):すべてのオブジェクトのリストを取得するための最初の要求を1つ送信し、その後、各レコードのマップされたテーブルに対して新しい要求を送信します。
したがって、テストDBに2000レコードがあるとします。そして、3つの@oneToOneマップテーブル。
良いケースでは、リストを取得するための1つのリクエストと、マップされたテーブルを取得するための3つのリクエストを送信します。
警告の場合、リストを取得するための最初の要求を1つ送信します。次に、DB内の2000レコードごとにマップされた情報を取得するための3つのリクエストを送信します。したがって、1999 * 3 = 5997は、@ Controller(Spring MVC)を呼び出すたびに、ユーザーごとに追加のリクエストを送信します。
WebアプリケーションとMySQLサーバーが同じサーバー上にある間、私はそれに気づいていませんでした。