【问题标题】:Slick/HikariCP giving "too many connections" instead of timeoutsSlick/HikariCP 提供“太多连接”而不是超时
【发布时间】:2016-12-06 01:37:31
【问题描述】:

我正在使用 Slick3.1.1 + HikariCP2.5.1 连接到 AWS t2.medium MySql 实例。 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    
}

当我用重负载击中它时,我开始收到“连接太多”错误:

    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]
...

我对此感到困惑。从文档中我认为它永远不应该尝试获得超过我指定的 222 个连接,这永远不会超过 AWS 限制。我期待在重负载下会超时,但不会出现“连接太多”错误。那么maxConnections 是做什么的呢?谢谢。

【问题讨论】:

  • 如果将minConnections 设置为222,是否也会立即发生? (让我们确定问题出在 Slick 部分保留了比指定更多的连接;而不是 MySQL 抛出远低于限制的异常)
  • 它不会立即发生。日志显示它会一个一个地打开连接,如果负载不是太重,它永远不会有问题。只有负载太高才会打开太多连接。
  • 你的意思是即使你设置了minConnections = 222 ?
  • 你是对的。 (我最初误读了您的评论)。我已经在下面的回答中解释了。谢谢!

标签: mysql slick hikaricp aws-rds


【解决方案1】:

修复它。正如上面@Pawel Dolega 所建议的那样,我还将minConnections = 222 设置为实验。在启动应用程序时,我立即开始收到too many connections 错误,即使没有负载。原来是我的错误:我实际上打开了多个单独的数据库实例,因为我在每个需要 db 访问的类中都使用了以下特征:

trait dbCore {
  val db = Database.forConfig("rdsConfig")
}

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

【讨论】:

  • 感谢您的反馈。这对我帮助很大。
猜你喜欢
  • 2017-01-20
  • 2019-10-27
  • 2020-06-19
  • 2019-03-02
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
相关资源
最近更新 更多