仕事未分類

Tomcatが突然の停止。コネクションプーリングまわりに異常あり。

現在、Java11(AmazonCorretto 11.0.9)&Tomcat9(9.0.30)の環境でWebシステムを開発中なのですが、つい先日までピンピン動いていたTOMCATさんが突然、機能を停止しました。

Eclipse上で見るとTOMCATは起動しているはずなのに、「http://localhost:8080/」にアクセスしても404が返ってきます。ただ、不思議なことに起動後数分待ってみると無事にアクセスできるようになりました。

コンソールから起動時の情報を確認してみると、JDBCドライバがなにか怪しい挙動をしていることがわかります。

①情報: サーバーの起動 [1,066]ms
②Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.
Driver'.The driver is automatically registered via the SPI and manual loading of the driver class is
generally unnecessary.

TOMCAT起動後、コンソールには上記①のログまでが表示されます。この段階でアクセスすると404が返ってきます。そして数分待つと②のログが表示されるのですが、この段階になると無事にアクセスできるようになります。メッセージの内容を翻訳すると、下記のような意味になります。

「com.mysql.jdbc.Driver」は非推奨です。新しいドライバは「com.mysql.cj.jdbc.Driver」になります。このドライバーはSPIを介して自動的に登録されます。通常、ドライバークラスの手動ロードは不要です。

非推奨のドライバを使い続けるのをやめて、context.xmlの該当箇所を新しいドライバに変更したところ、TOMCATは通常通り起動するようになりました。ちなみに変更後のcontext.xmlは下記のようにしています。


<?xml version="1.0" encoding="UTF-8" ?>
<Context reloadable="true">
<Resource name="jdbc/lbg" auth="Container" 
  type="javax.sql.DataSource" 
  username="root" 
  password="xxxx" 
  driverClassName="com.mysql.cj.jdbc.Driver"
  url="jdbc:mysql://localhost/hogehoge?serverTimezone=JST" 
  maxActive="4" 
  maxWait="5000" 
  maxIdle="2" 
  validationQuery="SELECT count(*) FROM player" />

この状態でうまくいっていたのですが、またしばらくするとTOMCATご臨終が再現します。今度は起動時のメッセージに下記のような警告が含まれるようになっていました。

警告: Name = lbg Property maxActive is not used in DBCP2, use maxTotal instead. maxTotal default
value is 8. You have set value of "4" for "maxActive" property, which is being ignored.
警告: Name = lbg Property maxWait is not used in DBCP2 , use maxWaitMillis instead. maxWaitMillis
default value is -1. You have set value of "5000" for "maxWait" property, which is being ignored.

翻訳すると下記のような意味になります。

maxActiveはDBCP2では使われていない。代わりにmaxTotalを使おう。maxTotalのデフォルトは8であり、あなたがmaxActiveとして設定した4は無視されている。
maxWaitはDBCP2では使われていない。代わりにmaxWaitMillisを使おう。maxWaitMillisのデフォルトは-1であり、あなたがmaxWaitとして設定した5000は無視されている。

maxWaitMillisとは、コネクション待機時間の最大値でして、これが-1ということは無限に待機するということだと思います。恐らくこれが悪さをしているのだろうということで、context.xmlのパラメータを修正しました。


<?xml version="1.0" encoding="UTF-8" ?>
<Context reloadable="true">
<Resource name="jdbc/lbg" 
  auth="Container" 
  type="javax.sql.DataSource" 
  username="root" 
  password="xxxx" 
  driverClassName="com.mysql.cj.jdbc.Driver"
  url="jdbc:mysql://localhost/hogehoge?serverTimezone=JST" 
  maxTotal="8" 
  maxWaitMillis="5000" 
  maxIdle="2" 
  validationQuery="SELECT count(*) FROM player" />

変更後は、正常にTOMCATが稼働しています。