50

この質問は、SO で数回、他のサイトで何度も尋ねられています。しかし、満足のいく答えは得られませんでした。

私の問題:
単純なJDBCを使用してGlassfishアプリケーションサーバー を介してmysqlデータベースに接続するJava Webアプリケーションがあります。

次の構成で、glassfish サーバーで接続プールを使用しました:
初期プール サイズ: 25
最大プール サイズ: 100
プール サイズ変更数: 2
アイドル タイムアウト: 300 秒
最大待機時間: 60,000 ミリ秒

このアプリケーションは過去 3 か月間デプロイされており、問題なく動作していました。
しかし、過去2日間から、ログイン時に次のエラーが発生しています。

部分的なスタック トレース

com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after connection closed.Connection was implicitly closed due to underlying exception/error:  

** BEGIN NESTED EXCEPTION **  

com.mysql.jdbc.CommunicationsException  
MESSAGE: Communications link failure due to underlying exception:  

** BEGIN NESTED EXCEPTION **  

java.io.EOFException  
MESSAGE: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.  

STACKTRACE:  

java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.  
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1997)  
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2411)  
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2916)  
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)  
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)  
at com.mysql.jdbc.Connection.execSQL(Connection.java:3256)  
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1313)  
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1448)  
............  
............  
my application traces....  

突然このエラーが発生した原因は何ですか? 私はこれで多くの時間を失いました。

編集:サーバーを再起動した後も問題は解決しません。DBA によると、重要な mysql サーバー構成の 2 つ次のとおり
です

EDIT-2 :多くのことを読み、いくつかの肯定的な結果を期待した後、接続プールにこれらの変更を加えました。

最大待機時間 : 0 (以前は 60 秒でした)
接続検証 :必須
検証方法 :テーブル
テーブル名 :デモ
検証は最大 1 回 : 40 秒
作成再試行回数 : 1
再試行間隔 : 5 秒
最大接続使用量 : 5

アプリケーションが3日間一貫して実行されているため、これは機能しました。しかし、これについて非常に奇妙で興味深い結果が得られました。接続プールを監視しているときに、次の数値を見つけました。

NumConnAcquired : 44919 カウント
NumConnReleased : 44919 カウント
NumConnCreated : 9748 カウント
NumConnDestroyed : 9793 カウント
NumConnFailedValidation : 70 カウント
NumConnFree : 161 カウント
NumConnUsed : -136 カウント

私が持っているように、どうすればNumConnFree161になることができMaximum Pool Size = 100 ますか?-136、の数になるには
どうすればよいですか? どうすれ> ?NumConnUsed
NumConnDestroyed NumConnCreated

4

9 に答える 9

12

おそらくファイアウォールのアイドル タイムアウトなどが原因で、接続に失敗しました。JDBC ドライバーが失敗時に再接続するように構成されていない場合、新しい接続を開かない限り、このエラーは解消されません。

データベース接続プールを使用している場合 (使用していますよね?)、アプリケーションに戻す前に、接続が機能しているかどうかを確認するクエリを発行するなどの接続チェック機能を有効にする必要があります。Apache commons-dbcp では、これは と呼ばれ、validationQuery多くの場合、 のような単純なものに設定されSELECT 1ます。

MySQL を使用しているため、実際に真の SQL クエリを発行するよりも軽量な Connector/J 固有の「ping」クエリを使用し、検証クエリを/* ping */ SELECT 1(ping 部分は正確である必要があります) に設定する必要があります。

于 2012-12-28T16:47:57.110 に答える
9

これはJavaのEndOfFileExceptionであり、カーソルの開始点が終了点にある場合、または予期しない例外が原因でデータベース接続が閉じられた場合に発生します。

于 2012-12-28T07:25:32.767 に答える
9

これは、データベースが再起動したか、データベースへのネットワーク接続が切断された (NAT 接続がタイムアウトしたなど) ことを意味している可能性が高く、webapp が古いデータベース接続を使用しようとしています。

Web コンテナを再起動しても問題が解決しない場合は、より深刻な問題である可能性があります。


あなたは次のように尋ねました:

How can the NumConnFree become 161 as I have Maximum Pool Size = 100 ?
How can the NumConnUsed become -136, a negative number ?
How can the NumConnDestroyed > NumConnCreated ? 

一見すると、これらは意味がありません。ただし、一部の使用カウンターがスレッドセーフではない方法で更新された結果である可能性があります。これは必ずしも元の問題とは関係ありません。

于 2012-12-19T10:51:02.553 に答える
2

ファイアウォール関連の問題である可能性があります。

于 2013-01-03T10:11:52.383 に答える