【问题标题】:Google Cloud SQL + Hikari CP + Communications link failureGoogle Cloud SQL + Hikari CP + 通信链路故障
【发布时间】:2015-02-17 23:22:30
【问题描述】:

Spring Boot 应用程序使用此处描述的配置设置与 D1 Google CloudSQL Server 通信时遇到间歇性连接错误HikariCP MySQL settings

我想知道是否有人以前遇到过这种情况。

我已阅读此处发布的常见问题解答 Hikari FAQ,我想知道我的默认 idleTimeout 和 maxLifeTime(30 分钟)设置是否有问题;服务器上的wait_timeout和interactive_timeout都设置为默认28800s(8小时)。

FAQ 说这两个设置应该比服务器设置少大约一分钟,但如果我在 30 分钟后失去连接,我不太明白将 maxLifeTime 提高到 7hrs 59mins 会如何改善这种情况.

有人有什么建议吗?

编辑的堆栈跟踪:

不时获取这些

org.springframework.security.authentication.InternalAuthenticationServiceException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Timeout after 30018ms of waiting for a connection.
    at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:110)
    at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:132)
    at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:156)
    at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:177)
...
Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Timeout after 30023ms of waiting for a connection.
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80)
 ....
 Caused by: java.sql.SQLException: Timeout after 30023ms of waiting for a connection.
    at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:208)
    at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:108)
    at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
    ... 59 common frames omitted

    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:630)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:695)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:727)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:737)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:787)

休眠搜索:

2015-02-17 10:34:17.090  INFO 1 --- [ entityloader-2] o.h.s.i.SimpleIndexingProgressMonitor    : HSEARCH000030: 31050 documents indexed in 1147865 ms
2015-02-17 10:34:17.090  INFO 1 --- [ entityloader-2] o.h.s.i.SimpleIndexingProgressMonitor    : HSEARCH000031: Indexing speed: 27.050219 documents/second; progress: 99.89%
2015-02-17 10:41:59.917  WARN 1 --- [ntifierloader-1] com.zaxxer.hikari.proxy.ConnectionProxy  : Connection com.mysql.jdbc.JDBC4Connection@372f2018 (HikariPool-0) marked as broken because of SQLSTATE(08S01), ErrorCode(0).

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 1,611,087 milliseconds ago.  The last packet sent successfully to the server was 927,899 milliseconds ago.

目前我认为索引不是特别快,因为我没有使用预测。执行该过程大约需要 30 分钟。

谢谢

【问题讨论】:

  • 您收到的具体异常(消息)是什么? maxLifeTime 应该至少比服务器端超时少 1 分钟。另一个问题是,您是在 在 Connection 上执行(多个)语句的中间,还是在池中的 Connection 上执行的 first 语句中遇到这些错误?
  • 感谢您回复我。我发布了一些经过编辑的堆栈跟踪,可能会以某种方式回答您的问题。我遇到间歇性连接超时,并且在 Hibernate 搜索索引结束时出现链接故障。
  • 我还注意到,在一个可能相关的注释中,当我使用 MySQL Workbench 连接到实例时,连接会在几个小时内断开。

标签: google-cloud-sql hikaricp


【解决方案1】:

这里可能有几件事。首先,应用层和数据库层之间的网络基础设施(防火墙、负载平衡器等)可以强加自己的连接超时,而与 MySql 设置无关。

索引失败表示连接在池外大约 27 分钟,并且在发生该故障时没有任何 SQL 活动。

其次,特别是关于“Could not get JDBC Connection”错误,你可能会遇到Cloud SQL connection limits。

我推荐三件事。一,确保您使用的是最新的 HikariCP (2.3.2) 和最新的 MySql Connector/J 驱动程序 (5.1.34)。二,为 com.zaxxer.hikari 包启用 DEBUG 级日志记录。 HikariCP 调试日志不是“闲聊”,而是每 30 秒记录一次池统计信息(有时在故障情况下会更详细)。最后,尝试将maxPoolSize 设置为更小的值(除非已经设置为默认值),并将maxLifeTime 设置为15 或20 分钟(1200000 毫秒)。

如果错误再次发生,请在失败时发布包含 HikariCP 调试日志的更新日志。此外,请随时在 Github 上打开一个跟踪问题,因为更大的日志等在那里更容易。

【讨论】:

  • 非常感谢您的回复。您链接的 Stack Overflow 帖子建议 maxPoolSize 约为 30。正确吗?
  • 这似乎是对的。但是请注意,当 HikariCP 关闭连接时,它是异步执行的。通常在几毫秒内。但这可能意味着一个或多个实时连接的瞬时数量高于 maxPoolSize ...所以我会将 maxPoolSize 设置为比数据库配置的最大值少几个插槽(在这种情况下,可能是 28)。
  • 我已经尝试了 3 条建议中的 2 条。我将不得不研究如何使用 Spring Boot 配置包级别 log4j。在几次空运行中,索引过程现在每秒管理大约 300 个文档,而不是大约 30 个(但是性能是可变的)。
  • 我会接受这个答案,因为它似乎已经缓解了我遇到的一些问题。大规模索引后仍然存在问题,我将为其打开一个跟踪问题。
猜你喜欢
  • 1970-01-01
  • 2012-05-27
  • 2018-02-17
  • 2012-10-14
  • 2011-08-12
  • 1970-01-01
  • 2012-02-21
  • 2014-12-31
  • 2011-02-28
相关资源
最近更新 更多