この質問は、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 カウント
私が持っているように、どうすればNumConnFree
161になることができMaximum Pool Size = 100
ますか?-136、負の数になるには
どうすればよいですか? どうすれば> ?NumConnUsed
NumConnDestroyed
NumConnCreated