質問

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&amp;useEncoding=true&amp;characterEncoding=UTF-8"  />

使っています autoReconnect=true エラーの指示どおりに実行しても、接続は切断され続けます。こんなことが起こるのを今まで見たことがありません。

また、すべてのデータベース接続が適切に閉じられていることも確認しました。

役に立ちましたか?

解決

Tomcat のドキュメント

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 分ごとに接続を実行し、アイドル状態の接続を削除して閉じるように接続プールに指示します。

RemoveAbandoned オプションは DBCP 1.2 以降非推奨になりました (ただし、 まだ存在します 1.3 ブランチ内)。 ここは非公式の説明です。

上記の答えが基本的に同じことをしているかどうかはわかりませんが、一部のシステムは週に約1回DB接続を使用しており、接続を設定するためにmysqlに-Otimeoutフラグまたはそのようなものを提供していることがわかりました。タイムアウト。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top