0

我们在带有 DR 节点的云实例上使用 DB2。应用程序使用 hikari 池进行连接池实现。虽然这适用于主要活动,但一旦主要关闭并启用 DR,我们就无法维护池。DB2 ACR 特性允许我们将备用服务器配置定义为 JDBC URL 的一部分,并且一旦主服务器出现故障,DB2 驱动程序将连接重定向到备用服务器。我希望了解 Hikari 客户如何应对这种变化。在对此进行测试时,我们发现在 Hikari 的当前配置下,启用 DR 时会收到以下错误。

Dec 4 21:09:12 cloudfoundry xsmf-hclgit-prod WARN HikariPool-1 - Failed to validate connection com.ibm.db2.jcc.t4.b@6817a942 ([jcc][t4][10335][10366][4.25.13] Invalid operation: Connection is closed. ERRORCODE=-4470, SQLSTATE=08003). Possibly consider using a shorter maxLifetime value. Dec 4 21:09:12 cloudfoundry xsmf-hclgit-prod WARN HikariPool-1 - Failed to validate connection com.ibm.db2.jcc.t4.b@24477f6 ([jcc][t4][10335][10366][4.25.13] Invalid operation: Connection is closed. ERRORCODE=-4470, SQLSTATE=08003). Possibly consider using a shorter maxLifetime value.

服务器的 -4470 代码实际上意味着连接已从服务器端关闭(这是 DB2 端的正确行为,因为主服务器出现故障,现有连接将引发此错误)。我的理解是,有了这个错误,hikari 池应该刷新连接,并且在新请求时,DB2 驱动程序将注意它现在与备用服务器(而不是主服务器)建立连接。然而,他似乎并没有以这种方式工作,因为 Hikari 似乎继续使用从服务器端关闭的连接。这导致 Hikari 没有获得任何活动连接并开始退出。

任何有助于使其协同工作的指针(Hikari 池刷新 + DB2 ACR 到备用服务器)都将非常有帮助。

为了您的理解,我还分享了将备用服务器定义为 URL 的一部分的 hikari 池属性

datasource: url: jdbc:db2://<primary server name>:50001/BLUDB:sslConnection=true;enableClientAffinitiesList=1;affinityFailbackInterval=120;clientRerouteAlternateServerName=<Alternate Server Name>;clientRerouteAlternatePortNumber=50001,50001;enableSeamlessFailover=1;maxRetriesForClientReroute=3;retryIntervalForClientReroute=2; username: ${DB2_USERNAME} password: ${DB2_PASSWORD} driver-class-name: com.ibm.db2.jcc.DB2Driver type: com.zaxxer.hikari.HikariDataSource hikari: connection-timeout: 600000 maximum-pool-size: 100 max-lifetime: 2000000 validation-timeout: 5000 data-source-properties: cachePrepStmt: true

发布上述错误(连接关闭),我还看到以下有关新连接请求的日志

ERR org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 600002ms. Dec 4 21:19:12 cloudfoundry xsmf-hclgit-prod ERR at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:82) Dec 4 21:19:12 cloudfoundry xsmf-hclgit-prod ERR at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:612) Dec 4 21:19:12 cloudfoundry xsmf-hclgit-prod ERR at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:669) Dec 4 21:19:12 cloudfoundry xsmf-hclgit-prod ERR at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:700) Dec 4 21:19:12 cloudfoundry xsmf-hclgit-prod ERR at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:712) Dec 4 21:19:12 cloudfoundry xsmf-hclgit-prod ERR at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:768) Dec 4 21:19:12 cloudfoundry xsmf-hclgit-prod ERR at com.hcl.service.dao.UserDaoImpl.getAuthorizationClaims(UserDaoImpl.java:3272) Dec 4 21:19:12 cloudfoundry xsmf-hclgit-prod ERR at com.hcl.service.dao.UserDaoImpl$$FastClassBySpringCGLIB$$eefb69c8.invoke(<generated>) Dec 4 21:19:12 cloudfoundry xsmf-hclgit-prod ERR at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) Dec 4 21:19:12 cloudfoundry xsmf-hclgit-prod ERR at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) Dec 4 21:19:12 cloudfoundry xsmf-hclgit-prod ERR at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)

4

0 回答 0