Play 2.1 Scala SQLException连接等待免费可用连接超时

时间:2013-12-04 21:37:38

标签: scala jdbc playframework playframework-2.0 h2

我已经在这个问题上工作了很长一段时间,我找不到解决方案......

使用h2 db(for dev)和简单的Model包使用play framework 2.2.1构建的Web应用程序。 我正在尝试实现REST JSON端点,代码可以工作......但每个服务器实例只能运行一次。

def createOtherModel() = Action(parse.json) {
  request =>
    request.body \ "name" match {
      case _: JsUndefined => BadRequest(Json.obj("error" -> true,
        "message" -> "Could not match name =(")).as("application/json")
      case name: JsValue =>
          request.body \ "value" match {
            case _: JsUndefined => BadRequest(Json.obj("error" -> true,
              "message" -> "Could not match value =(")).as("application/json")
            case value: JsValue =>
              // this breaks the secod time
              val session = ThinkingSession.dummy
              val json = Json.obj(
                  "content" -> value,
                  "thinkingSession" -> session.id,
                )
              )
              Ok(Json.obj("content" -> json)).as("application/json")
          }
        } else {
          BadRequest(Json.obj("error" -> true,
            "message" -> "Name was not content =(")).as("application/json")
        }
    }
}

基本上我读了JSON,回显“value”值,创建一个模型obj并发送它的id。

ThinkingSession.dummy函数执行此操作:

def all(): List[ThinkingSession] = {

// Tried explicitly closing connection, no difference
//val conn = DB.getConnection()
//try {
//  DB.withConnection { implicit conn =>
//    SQL("select * from thinking_session").as(ThinkingSession.DBParser *)
//  }
//} finally {
//  conn.close()
//}
  DB.withConnection { implicit conn =>
    SQL("select * from thinking_session").as(ThinkingSession.DBParser *)
  }
}

def dummy: ThinkingSession = {
  (all() head)
}

所以这应该做SELECT * FROM thinking_session,从结果创建一个模型obj列表并返回列表中的第一个。

这在服务器启动后第一次正常工作,但第二次得到

play.api.Application$$anon$1: Execution exception[[SQLException: Timed out waiting for a free available connection.]]
    at play.api.Application$class.handleError(Application.scala:293) ~[play_2.10.jar:2.2.1]
    at play.api.DefaultApplication.handleError(Application.scala:399) [play_2.10.jar:2.2.1]
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$2$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:261) [play_2.10.jar:2.2.1]
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$2$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:261) [play_2.10.jar:2.2.1]
    at scala.Option.map(Option.scala:145) [scala-library.jar:na]
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$2.applyOrElse(PlayDefaultUpstreamHandler.scala:261) [play_2.10.jar:2.2.1]
  Caused by: java.sql.SQLException: Timed out waiting for a free available connection.
    at com.jolbox.bonecp.DefaultConnectionStrategy.getConnectionInternal(DefaultConnectionStrategy.java:88) ~[bonecp.jar:na]
    at com.jolbox.bonecp.AbstractConnectionStrategy.getConnection(AbstractConnectionStrategy.java:90) ~[bonecp.jar:na]
    at com.jolbox.bonecp.BoneCP.getConnection(BoneCP.java:553) ~[bonecp.jar:na]
    at com.jolbox.bonecp.BoneCPDataSource.getConnection(BoneCPDataSource.java:131) ~[bonecp.jar:na]
    at play.api.db.DBApi$class.getConnection(DB.scala:67) ~[play-jdbc_2.10.jar:2.2.1]
    at play.api.db.BoneCPApi.getConnection(DB.scala:276) ~[play-jdbc_2.10.jar:2.2.1]

我的application.conf(db部分)

db.default.driver=org.h2.Driver
db.default.url="jdbc:h2:file:database/[my_db]"
db.default.logStatements=true
db.default.idleConnectionTestPeriod=5 minutes
db.default.connectionTestStatement="SELECT 1"
db.default.maxConnectionAge=0
db.default.connectionTimeout=10000

最初,我的配置中唯一设置的是连接并发生错误。在阅读网络上的问题时,我添加了所有其他内容。

有趣的是,当我在内存数据库中使用h2时,它在服务器启动后运行一次,然后失败。当我使用h2文件系统db时,无论服务器实例如何,它只能工作一次。

有人能就这个问题给我一些见解吗?已经发现了一些关于bonecp问题的东西,并尝试升级到0.8.0-rc1但没有任何改变......我不知所措=(

2 个答案:

答案 0 :(得分:0)

尝试设置maxConnectionAge和空闲超时

答案 1 :(得分:-2)

事实证明错误在其他地方......这是一个很好的堆栈溢出...很久没见过了。我试着投下我的问题,但这不可能^^