3

Hibernate を使用して MySQL データベースと通信しているときに、アプリケーションでこの例外が発生することがあります。C3p0 のプロパティを調整しようとしましたが、うまくいかないようです。

C3p0 関連の設定は次のとおりです。

<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.idle_test_period">60</property><!-- in seconds -->
<property name="hibernate.c3p0.min_size">2</property>
<property name="hibernate.c3p0.max_size">10</property>
<property name="hibernate.c3p0.max_statements">0</property>
<property name="hibernate.c3p0.timeout">180</property>
<property name="hibernate.c3p0.preferredTestQuery">select 1</property>

接続 URL は次のようになります。

jdbc:mysql://<DB endpoint>?autoReconnect=true&useUniCode=true&characterEncoding=UTF-8&useSSL=true&requireSSL=true&verifyServerCertificate=false

スタックトレースは次のとおりです。

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
Last packet sent to the server was 1549998 ms ago.

Caused by: javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLException: java.net.SocketException: 
Connection reset

MySQL システム変数を微調整する必要がありますか? この例外を回避するにはどうすればよいですか?

ありがとうジテンドラ

4

2 に答える 2

3

プールにいくつかの接続があり、それらの一部のみを使用しているようです。それらのいくつかは、使用されるのを待って、古くなります(接続が何らかの理由でリセットされます-たとえば、DB側でのタイムアウト)。その後、ある瞬間にそれらを使おうとすると、例外が発生します。

通常、これを修正するためのいくつかのオプションがあります。たとえば、プールから接続を取得する前に接続をテストできます(hibernate.c3p0.testConnectionOnCheckout)

さらに、プール内の接続のステータスを定期的にチェックしたり、チェックイン時に接続をチェックしたりできます。http://www.mchange.com/projects/c3p0/#configuring_connection_testingを参照してください

それが役に立たない場合は、スタックトレース全体が役立つ可能性があります。

于 2012-09-28T08:27:04.750 に答える
3

hibernate.c3p0.idle_test_period -- または c3p0.idleConnectionTestPeriod は、接続が 60 秒間アイドル状態の場合にのみ 60 秒ごとにテストします。アプリが非常にアクティブな場合、それほど長くアイドル状態になることはありません。c3p0 は、アプリケーションが受信した例外が接続を無効にする必要があることを意味する場合に通知しようとしますが、それはデータベース/JDBC ドライバー間で一貫性がなく、完全に信頼できるわけではない例外の SQLState に依存します。切断された接続がチェックイン/チェックアウトの複数回のラウンドを生き残ることはめったにありませんが、設定によっては発生する可能性があります。

最も簡単な解決策は、構成に c3p0.testConnectionOnCheckin を追加することです。これにより、接続がビジーであるかアイドルであるかに関係なく、チェックアウト時のテストの同期オーバーヘッドを発生させることなく、接続がプールに許可される前にテストされることが保証されます。

http://www.mchange.com/projects/c3p0/#configuring_connection_testingをご覧ください。

また、設定している構成パラメータが基礎となる接続プールに到達していることを確認してください。c3p0 は、プールの初期化時に INFO レベルでその構成をログにダンプします。ログをチェックして、設定が想定どおりであることを確認します。(または、アプリケーションが jmx を介して実行されている間にプールを検査することもできます。)

幸運を!

于 2012-09-28T09:18:32.510 に答える