Scala/Slick,"等待连接20000ms后超时"错误

use*_*214 19 mysql scala sbt slick hikaricp

下面的代码块一直在抛出错误.

  Timeout after 20000ms of waiting for a connection.","stackTrace":[{"file":"BaseHikariPool.java","line":228,"className":"com.zaxxer.hikari.pool.BaseHikariPool","method":"getConnection"
Run Code Online (Sandbox Code Playgroud)

此外,我的数据库访问看起来太慢,xs.map()的每个元素大约需要1秒.下面,getFutureItem()调用db.run().

xs.map{ x => 
    val item: Future[List[Sometype], List(Tables.myRow)] = getFutureItem(x)         
    Await.valueAfter(item, 100.seconds) match {
        case Some(i) => i
        case None => println("Timeout getting items after 100 seconds")
    }
}
Run Code Online (Sandbox Code Playgroud)

Slick会在每次迭代"x"值时记录此信息:

[akka.actor.default-dispatcher-3] [akka://user/IO-HTTP/listener-0/24] Connection was PeerClosed, awaiting TcpConnection termination...
[akka.actor.default-dispatcher-3] [akka://user/IO-HTTP/listener-0/24] TcpConnection terminated, stopping
[akka.actor.default-dispatcher-3] [akka://system/IO-TCP/selectors/$a/0] New connection accepted
[akka.actor.default-dispatcher-7] [akka://user/IO-HTTP/listener-0/25] Dispatching POST request to http://localhost:8080/progress to handler Actor[akka://system/IO-TCP/selectors/$a/26#-934408297]
Run Code Online (Sandbox Code Playgroud)

我的配置:

"com.zaxxer" % "HikariCP" % "2.3.2"

default_db {
  url = ...
  user = ...
  password = ...
  queueSize = -1
  numThreads = 16
  connectionPool = HikariCP
  connectionTimeout = 20000
  maxConnections = 40
}
Run Code Online (Sandbox Code Playgroud)

是否有任何明显的错误导致这些数据库访问速度如此之慢并抛出此错误?如果需要,我可以提供更多信息.

编辑:我收到一个建议,该问题可能是一个类加载器错误,我可以通过将项目部署为单个.jar来解决它,而不是使用sbt运行它.

编辑2:经过进一步检查后,似乎许多连接处于打开状态,最终导致无法连接.这可以通过调用db.close()在适当的时间关闭连接来解决.

EDIT3:解决了.slick建立的连接超出了我的mysql配置允许的最大连接数.

Eug*_*ota 2

OP 写道:

EDIT2:经过进一步检查,似乎许多连接都处于打开状态,这最终导致没有可用的连接。这可以通过在适当的时间调用 db.close() 关闭连接来解决。

编辑3:解决了。slick 建立的连接超出了我的 mysql 配置允许的最大连接数。