Domanda

I have an interesting issue which I have not been able to resolve. I am using Play! 2.0.4 and using the integrated BoneCP connection pool to get the DB connections. However, for some reason, BoneCP keeps returning closed connections.

Database Server: Amazon RDS MySQL 5, default timeout settings (which should be 8 hours...)

My Play Datasource configuration looks as follows:

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

I had assumed setting the idleConnectionTestPeriod to 2 minutes surely would have prevented BoneCP from returning closed connections, but it hasn't.

Every so often, I get the following stack trace in my logs:

    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)   

Does anybody know how I can fix this issue? Currently, I've had to wrap the DB.getConnection() in a try/catch and just catch the exception thrown by BoneCP and retry until I retrieve a valid connection. Seems like that should be unnecessary.

Thanks for any help.

È stato utile?

Soluzione

Please try with 0.8.0-beta1. There was a bug related to this.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top