ここでこのトピックに関する関連する質問を調べ、しばらくグーグルで検索しました。それでも、Tomcat の DBCP 構成またはメカニズムで重要なことを理解していないようです。
Tomcat 6、DBCP リソースが構成されていますserver.xml
:
<Resource name="jdbc/myDB" auth="Container" description="Database connection"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://myhost:3306/mydb?autoReconnectForPools=true&useUnicode=true"
username="user"
password="password"
validationQuery="SELECT 1"
testOnBorrow="true"
testWhileIdle="true"
timeBetweenEvictionRunsMillis="10000" minEvictableIdleTimeMillis="60000"
maxActive="20" maxWait="20000" maxIdle="10"
removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true" />
また、mysqlを探しましwait_timeout
たが、デフォルトです28800
。
要約すると、いくつかのオプションを試しましたが、問題は、mysql 接続がアイドル状態で 28800 秒に達し、サーバーがそれらを閉じることです。プールは何とかこの状況をvalidationQuery
andtestOnBorrow
で処理するべきだと思っていましたが、間違っているようです。
アイドル期間後に使用するautoReconnect
と、url
最初のクエリの試行で " ...CommunicationsException: The last packet successfully received from the server was 157,493,261 milliseconds ago.
" が返されますが、その後は正常に動作します。
使用autoReconnectForPools
している場合、url
または使用していない場合 - アイドル期間 (8 時間) の後、毎回 " .MySQLNonTransientConnectionException: No operations allowed after connection closed
" になります。
どちらの場合も、アプリに負荷がかかっている間はスムーズに進みます。したがって、接続はmysql側から閉じられたと結論付けました。
助けて、何を見逃したの?Mysql で wait_timeout を変更せずにこの問題を解決したいと思います。目標 - アイドル時間が発生した場合でも生き残る可能性のある安定したアプリ:)