Jdbc 在MariaDB连接器中设置aurora后,DB连接增加

Jdbc 在MariaDB连接器中设置aurora后,DB连接增加,jdbc,mariadb,slick,hikaricp,amazon-aurora,Jdbc,Mariadb,Slick,Hikaricp,Amazon Aurora,我们正在使用MariaDB JDBC连接器Aurora特定功能测试故障切换行为 我们已将JDBC URL设置为: 问题是,只要我们在URL模式中添加aurora:部分,我们就可以看到到数据库编写器的连接增加,直到我们必须回滚更改为止(它甚至达到3.000个连接) 版本: 配置: master { profile = "slick.jdbc.MySQLProfile$" db { driver = "org.mariadb.jdbc.Driver" url =

我们正在使用MariaDB JDBC连接器Aurora特定功能测试故障切换行为

我们已将JDBC URL设置为:

问题是,只要我们在URL模式中添加
aurora:
部分,我们就可以看到到数据库编写器的连接增加,直到我们必须回滚更改为止(它甚至达到3.000个连接)

版本:

配置:

master {
  profile = "slick.jdbc.MySQLProfile$"
  db {
    driver = "org.mariadb.jdbc.Driver"
    url = "jdbc:mysql:aurora://cluster-name.cluster-xxx.us-east-1.rds.amazonaws.com/db_name?characterEncoding=utf8mb4&rewriteBatchedStatements=true&usePipelineAuth=false"
    user = "rw_user"
    password = "rw_user_pass"
    numThreads = 20
    queueSize = 1000000
  }
}
slaves = [
  {
    profile = "slick.jdbc.MySQLProfile$"
    db {
      driver = "org.mariadb.jdbc.Driver"
      url = "jdbc:mysql:aurora://cluster-name.cluster-ro-xxx.us-east-1.rds.amazonaws.com/db_name?characterEncoding=utf8mb4&usePipelineAuth=false"
      user = "ro_user"
      password = "ro_user_pass"
      numThreads = 20
      queueSize = 1000000
    }
  }
]
在升级MariaDB连接器版本后,我们尝试将
aurora:
部分添加到JDBC URL模式中,但与读取器的连接数再次开始增加:

如果我们在只读端点上运行
showprocesslist
,我们可以看到所有打开的连接处于“清理”状态和“睡眠”命令


我们从只读端点删除了
aurora:
部分,只是为了稳定到它的连接数。驱动程序是否可能在打开连接时搜索群集主机?这就可以解释这种行为。

一旦您通过了几十个活动连接,数据库就会开始自相矛盾。最好限制客户端中的连接,而不是假设您有无限的带宽来接受Aurora中的连接。

使用“Aurora”关键字driver时,在引擎盖下创建2个连接:

  • 与主服务器的连接
  • 与其中一个副本(如果有)的连接
目标始终是节省主服务器上的资源。通常,只配置一个池。然后,驱动程序根据[connection.setReadOnly][1]使用与主/副本的连接

当您有单独的“写”/“读”池时,使用配置“故障转移”将解决您的问题:驱动程序将只使用一个实际连接。 这样,就不会有“浪费”的连接


然后,故障转移将以不同的方式处理,但结果相同(例如,不在要发送到刚刚崩溃的复制副本的事务中的查询将不会直接使用主连接,因为在使用“aurora”配置时,驱动程序将在执行查询之前重新创建到另一个复制副本的新连接)(

Sure:)问题是,如果我不将
aurora:
部分添加到JDBC URL模式,HikariCP(数据库连接池)将正确管理客户端中的连接数。但只要我添加
aurora:
部分,它就不会这样做。如果这是一个bug,我如何向MariaDB JDBC连接器报告它?他们的repo中没有启用GitHub“问题”:/(Mariadb tracker链接是)您可以执行“show processlist”来列出这些多个连接及其状态吗?@DiegoDupin,谢谢您的帮助。我已经编辑了这个问题,提供了关于这个问题的更多细节,包括连接状态。@JavierCane你有没有想过这个问题?几年过去了,我遇到了同样的问题。根据你的评论,那么拥有多个Aurora Reader实例就没有多大意义了,是吗?我的意思是,如果驱动程序只选择一个读卡器副本,它将不会在不同的副本之间分配负载。它仅在副本故障转移的情况下有用:s2。根据您的建议,我们应该将主服务器的URL模式设置为
jdbc:mysql:aurora://
,将从服务器的URL模式设置为
jdbc:mysql:failover://
(),我了解您了吗?谢谢如果您使用“master”池配置仅用于连接到master,即永远不要使用connection.setReadOnly()或类似Spring@Transaction(readonly=true)的组件切换连接,那么您可以使用“jdbc:mysql:failover://”。这将避免为每个到主机的连接创建从属连接。replicat连接是在有效主机中随机选择的。此后,所有语句都将在该数据库服务器上运行,直到连接关闭(或失败)。因此,如果有60个到副本的连接,并且有一个由3个副本组成的集群,那么它们到每个副本的连接大约为20个。我刚刚理解了您的观点。我的错误是将连接池视为指向同一个读卡器的连接组。在您刚才描述的场景中,从属连接池将基于到不同随机读卡器的连接而形成,因此它实际上将平衡它们之间的负载。谢谢关于主连接池:1。因此,如果我用
failover:
config指向
cluster name.cluster xxx.us-east-1.rds.amazonaws.com
URL,它将始终打开与写入程序的连接?2.在这种情况下,我们会错过Aurora的任何其他连接器功能吗?
master {
  profile = "slick.jdbc.MySQLProfile$"
  db {
    driver = "org.mariadb.jdbc.Driver"
    url = "jdbc:mysql:aurora://cluster-name.cluster-xxx.us-east-1.rds.amazonaws.com/db_name?characterEncoding=utf8mb4&rewriteBatchedStatements=true&usePipelineAuth=false"
    user = "rw_user"
    password = "rw_user_pass"
    numThreads = 20
    queueSize = 1000000
  }
}
slaves = [
  {
    profile = "slick.jdbc.MySQLProfile$"
    db {
      driver = "org.mariadb.jdbc.Driver"
      url = "jdbc:mysql:aurora://cluster-name.cluster-ro-xxx.us-east-1.rds.amazonaws.com/db_name?characterEncoding=utf8mb4&usePipelineAuth=false"
      user = "ro_user"
      password = "ro_user_pass"
      numThreads = 20
      queueSize = 1000000
    }
  }
]