Top/Tomcat/エラー:Connection Reset

Tomcat/エラー:Connection Reset

TomcatをAPサーバとし、そこからルータやファイアウォール機器越しに別のDBサーバにアクセスすることがあります。
このような環境で、Tomcatのログ上に「Connection Reset」「IOエラー」が頻発し、最終的にはTomcatが利用できなくなってしまう現象に見舞われることがあります。理由はだいたい以下のようなものです。

ルータやファイアウォールは、設定により、無通信状態が長く続いているセッションを強制切断してしまうことがあります。強制切断のため、DBサーバ側にもAPサーバ側にも終了のパケットが流れないため、どちらもそのセッションが切断されていることに気づかない状況になります。

Tomcatは、JDBCでDBサーバに接続する場合、起動時にコネクションプールを(設定によりますが)数十本確保しますが、これらは全て常時利用されているわけではありません。このため、予備のコネクションプールは上記のルータなどの強制切断に巻き込まれ「実際には切断されているのにTomcat側からは利用可能なように見える」という状態になります。
このような状態で、Tomcat上のアプリが新たなコネクションプールをTomcatに借りにこようとすると、上記のコネクションを使ってしまい、接続エラーになってしまう、という状況が起きるようです。

これを防ぐためには、利用していないコネクションプール上で、適当な間隔で疎通確認用のSQLを投げ、ルータ側に「通信している」と思わせるのが良いようです。
Tomcatのserver.xmlの<Resource>タグの中に以下のオプションを環境に合わせて追加してみてください。

validationQuery="select 1 from dual"........疎通確認用SQL(※左記はOracleの場合。PostgreSQL等では違うSQLにしてください。)
testOnBorrow="true".........................Connection取得時に上記SQLで疎通確認する
testWhileIdle="true"........................アイドル中に上記SQLで疎通確認する
timeBetweenEvictionRunsMillis="3000"........アイドル中の疎通実行間隔(30秒)
minEvictableIdleTimeMillis="1800000"........この時間アイドルのままならコネクション破棄する(30分)

・参考URL:http://d.hatena.ne.jp/twisted0517/20120426/1335428390

このページを共有:
  • このページをはてなブックマークに追加 このページを含むはてなブックマーク
  • このページをlivedoor クリップに追加 このページを含むlivedoor クリップ
  • このページをYahoo!ブックマークに追加
  • このページを@niftyクリップに追加
  • このページをdel.icio.usに追加
  • このページをGoogleブックマークに追加

このページのURL:

ページ新規作成

新しいページはこちらから投稿できます。

TOP