玩 2.1 Scala SQLException Connection Timed out waiting for a free available connection

Posted

技术标签:

【中文标题】玩 2.1 Scala SQLException Connection Timed out waiting for a free available connection【英文标题】:Play 2.1 Scala SQLException Connection Timed out waiting for a free available connection 【发布时间】:2013-12-04 21:37:38 【问题描述】:

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

使用 h2 db(用于开发)和一个简单的模型包使用 play framework 2.2.1 构建的网络应用程序。 我正在尝试实现一个 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,回显“值”值,创建模型 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.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但没有任何改变......我不知所措=(

【问题讨论】:

【参考方案1】:

尝试设置 maxConnectionAge 和空闲超时

【讨论】:

尝试使用 maxConnectionAge=0 和 5 秒以及使用 idleTimeout=0 或更大,但它并没有改变任何东西 =(【参考方案2】:

原来错误出在其他地方......这是一个很好的堆栈溢出......很长时间没有看到过。我尝试否决我的问题,但这是不可能的^^

【讨论】:

嗨 NemoOudeis。你能告诉我你是怎么解决这个问题的。即使我也面临同样的问题

以上是关于玩 2.1 Scala SQLException Connection Timed out waiting for a free available connection的主要内容,如果未能解决你的问题,请参考以下文章

System.Data.SqlClient.SqlException:与 ASP.NET Core 2.1 和 SQL Server 组合的网络相关或实例 docker

无法解决简单的auth scala中的类型错误,玩框架项目

玩!框架。模板“包括”

玩!框架。创建一个新视图

如何使用 scala 2.9.x 运行 akka 2.1-snapshots?

从Resultset scala中检索对象数组