読者です 読者をやめる 読者になる 読者になる

メンチカツには醤油でしょ!!

ITエンジニア徒然 (AWS/Java/JavaScript/Google Spreadsheets/Jenkins/Mac/外部コミュニティ・勉強会レポ)

Hibernate(Wildfly) + MySQLでDB再接続ができなくなる

接続が切れた時のエラー

The last packet successfully received from the server was 00,000 milliseconds ago. The last packet sent successfully to the server was 00 milliseconds ago.
(00の部分は適当なミリ秒)

INFO [stdout] (default task-62) Hibernate: select * from my_application_table
WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-62) SQL Error: 0, SQLState: 08003
ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-62) No operations allowed after connection closed.
INFO [stdout] (default task-62) yyyy/mm/dd hh:mm:ss:sss ERROR
INFO [stdout] (default task-62) javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: could not prepare statement
INFO [stdout] (default task-62) Caused by: org.hibernate.exception.JDBCConnectionException: could not prepare statement
INFO [stdout] (default task-62) Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
INFO [stdout] (default task-62) Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
INFO [stdout] (default task-62)
INFO [stdout] (default task-62) The last packet successfully received from the server was 8,569 milliseconds ago. The last packet sent successfully to the server was 16 milliseconds ago.
INFO [stdout] (default task-62) Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
INFO [stdout] (default task-62) at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3004) ~[na:na]
INFO [stdout] (default task-62) at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3462) ~[na:na]
INFO [stdout] (default task-62) ... 222 common frames omitted

タイムアウト8時間問題ではない

ググってよく出てくるのがMySQLのタイムアウトが8時間うんたら…
ただ、一旦接続が切れるとコレが出続けてアプリサーバーの再起動を余儀なくされます。。これは良くない。
特に不安定な無線接続下などでは一旦接続が切れることもあるので
出る確率は高く、結構苦しい。

yyhayashi303.hatenablog.com

このサイトによると
・アプリケーションでコネクションを使用する前に有効性をテストする
・タイムアウトの設定値を増やす
・autoReconnect=trueの設定を追加する
の中から1の方法で解決すべきとあります。

今回はCommons DBCPでもSpringでもないので
Wildfly+MySQL的な解決方法で、standalone.xmlに

<datasource jndi-name…略>
<connection-url>略</connection-url>
<driver>mysql</driver>
<security>
<user-name>略</user-name>
<password>略</password>
</security>
<validation>
<check-valid-connection-sql>select 1</check-valid-connection-sql>
<validate-on-match>false</validate-on-match>
<background-validation>true</background-validation>
<background-validation-millis>10000</background-validation-millis>
</validation>
</datasource>

としたら再接続できるようになりました!!

参考

stackoverflow.com

stackoverflow.com