Slick/HikariCP 提供“太多连接”而不是超时

thu*_*und 2 mysql amazon-rds slick hikaricp

我正在使用Slick3.1.1+HikariCP2.5.1连接到 AWS t2.mediumMySql 实例。AWS 文档说t2.medium最多可以有 312 个连接。我的配置文件是:

rdsConfig = {
  url = "jdbc:mysql://mydb.........us-west-2.rds.amazonaws.com:3306/owlschema"  

  driver = "com.mysql.jdbc.Driver"
  connectionPool = HikariCP
  maxConnections = 222         # <<<<< ie make this < 312.
  keepAliveConnection = true
  properties = {
    user = "me"
    password = "mydarksecret"
  }
  numThreads = 40    
}
Run Code Online (Sandbox Code Playgroud)

当我承受重负载时,我开始收到“连接过多”错误:

    17:05:40.708 DEBUG [] [rdsConfig connection adder] com.zaxxer.hikari.pool.HikariPool - rdsConfig - Cannot acquire connection from data source
    com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Too many connections
        at sun.reflect.GeneratedConstructorAccessor59.newInstance(Unknown Source) ~[na:na]
...
Run Code Online (Sandbox Code Playgroud)

我对此很困惑。从文档中我认为它永远不应该尝试获取超过我指定的 222 个连接,这永远不会超过 AWS 限制。我预计在重负载下会出现超时,但不会出现“连接过多”错误。那么它有什么maxConnections作用呢?谢谢。

thu*_*und 5

修复。正如上面 @Pawel Dolega 所建议的,我也设置minConnections = 222为一个实验。启动应用程序后,too many connections即使没有负载,我也立即开始出现错误。事实证明这是我的错误:我实际上打开了多个单独的数据库实例,因为我在每个需要数据库访问的类中使用以下特征:

trait dbCore {
  val db = Database.forConfig("rdsConfig")
}
Run Code Online (Sandbox Code Playgroud)

因此,每个类都使用自己单独的 222 个连接上限。将此特征更改为对象而不是修复了错误 - 现在所有类都使用相同的单例数据库实例,因此maxConnections上限得到了适当的尊重。