Java+Tomcat、データベース接続が切断されていますか?
質問
Tomcat インスタンスをセットアップしましたが、データベース接続を設定しました context.xml
一定期間活動しないと死に続けます。
ログを確認すると、次のエラーが表示されます。
com.mysql.jdbc.Exceptions.jdbc4.CommunicationsException:サーバーから正常に受信した最後のパケットは68051秒前でした。サーバーに正常に送信された最後のパケットは68051秒前でした。これは、「wait_timeout」のサーバー構成値よりも長いです。アプリケーションで使用する前に、Connectionの有効性の有効期限および/またはテストのいずれか、クライアントのタイムアウトのサーバー構成値の増加、またはこの問題を回避するためにConnector/J Connectionプロパティ「AutoreConnect = true」を使用することを検討する必要があります。
context.xml の構成は次のとおりです。
<Resource name="dataSourceName"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="username"
password="********"
removeAbandoned = "true"
logAbandoned = "true"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/databasename?autoReconnect=true&useEncoding=true&characterEncoding=UTF-8" />
使っています autoReconnect=true
エラーの指示どおりに実行しても、接続は切断され続けます。こんなことが起こるのを今まで見たことがありません。
また、すべてのデータベース接続が適切に閉じられていることも確認しました。
解決
DBCP は、Jakarta-Commons データベース接続プールを使用します。これは、Jakarta-Commons コンポーネントの数に依存します。
* Jakarta-Commons DBCP
* Jakarta-Commons Collections
* Jakarta-Commons Pool
この属性が役に立つかもしれません。
removeAbandonedTimeout="60"
私は同じ接続プーリングのものを使用しており、Tomcat を通じて構成されていないのと同じことを防ぐためにこれらのプロパティを設定しています。しかし、最初のことがうまくいかない場合は、これらを試してください。
testWhileIdle=true
timeBetweenEvictionRunsMillis=300000
他のヒント
これの実際の原因を明確にするためです。MySQL はデフォルトで、非アクティブ状態が 8 時間続くと開いている接続を終了します。ただし、データベース接続プールはそれより長く接続を保持します。
したがって、timeBetweenEvictionRunsMillis=300000 を設定すると、5 分ごとに接続を実行し、アイドル状態の接続を削除して閉じるように接続プールに指示します。
上記の答えが基本的に同じことをしているかどうかはわかりませんが、一部のシステムは週に約1回DB接続を使用しており、接続を設定するためにmysqlに-Otimeoutフラグまたはそのようなものを提供していることがわかりました。タイムアウト。