解決できなかった興味深い問題があります。私はプレイを使用しています!2.0.4 を使用し、統合された BoneCP 接続プールを使用して DB 接続を取得します。ただし、何らかの理由で、BoneCP は閉じられた接続を返し続けます。
Database Server: Amazon RDS MySQL 5, default timeout settings (which should be 8 hours...)
私の Play データソース構成は次のようになります。
db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://{server}/{schema}?autoReconnect=true&useUnicode=yes&characterEncoding=UTF-8"
db.default.partitionCount=4
db.default.idleConnectionTestPeriod=2 minutes
idleConnectionTestPeriod を 2 分に設定すると、BoneCP が閉じた接続を返すのを確実に防ぐことができると想定していましたが、そうではありませんでした。
ときどき、ログに次のスタック トレースが記録されます。
Exception in thread "pool-6-thread-25" java.sql.SQLException: Connection is closed!
at com.jolbox.bonecp.ConnectionHandle.checkClosed(ConnectionHandle.java:350)
at com.jolbox.bonecp.ConnectionHandle.setReadOnly(ConnectionHandle.java:1089)
at play.api.db.BoneCPApi$$anon$1.onCheckOut(DB.scala:328)
at com.jolbox.bonecp.BoneCP.getConnection(BoneCP.java:514)
at com.jolbox.bonecp.BoneCPDataSource.getConnection(BoneCPDataSource.java:114)
at play.api.db.DBApi$class.getConnection(DB.scala:64)
at play.api.db.BoneCPApi.getConnection(DB.scala:273)
at play.api.db.DB$$anonfun$getConnection$1.apply(DB.scala:129)
at play.api.db.DB$$anonfun$getConnection$1.apply(DB.scala:129)
at scala.Option.map(Option.scala:133)
at play.api.db.DB$.getConnection(DB.scala:129)
at play.api.db.DB.getConnection(DB.scala)
at play.db.DB.getConnection(DB.java:50)
at play.db.DB.getConnection(DB.java:43)
at play.db.DB.getConnection(DB.java:29)
at com.edatasource.inboxtracker.tasks.TrackSiteEventActionTask.run(TrackSiteEventActionTask.java:23)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
この問題を解決する方法を知っている人はいますか? 現在、DB.getConnection() を try/catch でラップし、BoneCP によってスローされた例外をキャッチして、有効な接続を取得するまで再試行する必要がありました。それは不要であるように思われます。
助けてくれてありがとう。