Scala / Slick,“等待连接 20000 毫秒后超时”错误

Posted

技术标签:

【中文标题】Scala / Slick,“等待连接 20000 毫秒后超时”错误【英文标题】:Scala / Slick, "Timeout after 20000ms of waiting for a connection" error 【发布时间】:2015-11-03 00:05:11 【问题描述】:

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

  Timeout after 20000ms of waiting for a connection.","stackTrace":["file":"BaseHikariPool.java","line":228,"className":"com.zaxxer.hikari.pool.BaseHikariPool","method":"getConnection"

另外,我的数据库访问似乎太慢了,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")
    

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]

我的配置:

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

default_db 
  url = ...
  user = ...
  password = ...
  queueSize = -1
  numThreads = 16
  connectionPool = HikariCP
  connectionTimeout = 20000
  maxConnections = 40

是否有什么明显的错误导致这些数据库访问如此缓慢并引发此错误?如果需要,我可以提供更多信息。

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

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

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

【问题讨论】:

这值得一读,但不太可能是您的根本原因:github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing 您是否指定了驱动程序?应该有一个 slick 驱动程序和一个 JDBC 驱动程序 AFAIK。 请将分辨率添加到答案字段并关闭。 【参考方案1】:

OP 写道:

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

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

【讨论】:

以上是关于Scala / Slick,“等待连接 20000 毫秒后超时”错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Scala 中使用 Slick 库获取自动增量值

IDEA中搭建Scala + Play+Slick环境

Scala Slick 如何将 Scala 代码翻译成 JDBC?

Scala 用于理解 Slick Query

Scala + Play Framework + Slick - Json 作为模型字段

Scala / slick:如果不存在则获取插入的行的ID