2012-01-04 22 views
23

私はちょうど4.0を休止するように更新していると警告メッセージを見ています:HHH000387 Hibernate警告は何を意味しますか?

HHH000387: ResultSet's statement was not registered

を私のログファイルに。これはどういう意味ですか、私は心配すべきですか?

+2

私はこの質問の答えも知りたいと思います。 –

答えて

1

私はあまり心配しません。いずれにしても、このメッセージを避けるためにAPIのユーザーの手にはないようです。ロギングはorg.hibernate.engine.jdbc.internal.JdbcResourceRegistryImplで行われます。 documentationよる:

JdbcResourceRegistryの主な機能は、リソースがクリーンアップさ を確認することです。コードへ

ショート表情は、そのようなメッセージは、2つの状況でログインしていることを、伝え:

  1. のResultSetは、レジスタ・メソッドを介して登録され、文が登録されていません。
  2. ResultSetはrelease-methodでリリースされ、ステートメントは登録されていません。
1

このエラーをスローするJdbcResourceRegistryImplクラスのソースを見ると、私は個人的にはWARNレベルでのログを過剰にしていると思います。 StatementをすべてHibernate /フレームワーク設定の一部として暗黙的に登録する方法がない限り、INFOでなければなりません。 なぜそれが登録されるべきなのか私には分かりませんが、それがHibernateの内部動作の懸念事項であるなら、日常的にAPIユーザに警告するのはバグでしょうか?

1

このログメッセージは、ResultSet.getStatement()が元々ResultSetの作成を依頼されたStatementを返さないという兆候です。ラッパー/デコレーターとその下にあるStatementという2つのオブジェクトがあるため、JDBCラッパーを使用すると、この問題が発生する可能性があります。

私のプロジェクトでは、独自のJDBCラッパーをテストしています。私は(基礎となるStatementを返すことになる)getStatement()ではなく、基礎となるResultSetに委任するよりも、元Statementプロキシ(ない新しいプロキシ)を返すことを確実にすることによって、私のResultSetラッパーでこの警告を修正しました。

同様の警告を生成するJDBCラッパーは、おそらく同様の修正を使用する可能性があります。 (同様の問題と解決方法がStatement.getConnection()に適用される場合があります。)

はところで、このロギングのためのバグレポートがここにあります:https://hibernate.atlassian.net/browse/HHH-8210

0

あなたは、接続プールを構成していましたか?私は同じ警告を持っている。しかし、私がmaven依存関係にc3p0を追加し、それをhibernate.cfg.xmlで正しく設定すると、警告が消えます。

0

私の場合、この警告は巨大なパフォーマンスリークの指標でした! 私は@oneToOneマッピングを使って、休止状態のPOJOオブジェクトを持っています。 1つのテーブルでは正常に動作し、警告は出されません。MySQlサーバーにすべてのレコードを取得し、結合された各テーブルの1つの要求に対して1つの要求を送信します。 このエラーが発生するPOJO(@oneToOneが見つからない場合):すべてのオブジェクトのリストを取得するための最初のリクエストを送信し、毎回各レコードのマップされたテーブルに対する新規リクエストと新規リクエストを送信します。

私はテスト用データベースに2000個のレコードがあるとしましょう。 3 @oneToOneマップされたテーブル

場合によっては、リストを取得する要求が1回、マッピングされたテーブルを取得する要求が3回送信されます。

警告の場合、リストを取得するために1つの最初の要求を送信します。それから、DBの2000レコードごとにマップされた情報を取得する3つのリクエストを送信してください!したがって、@Controller(Spring MVC)を呼び出すたびに、各ユーザーごとに1999 * 3 = 5997回の追加要求が発生します。

WebアプリケーションとMySQLサーバーが同じサーバー上にある間、気づいていませんでした。

関連する問題