通过 JDBC 使用 SQLDB HA Premium Bluemix 服务时,如何减少连接和读取超时?

When using the SQLDB HA Premium Bluemix Service via JDBC, how can I reduce the connection and read timeouts?

SQLDB Bluemix 服务的高级计划支持 DB2 高可用性。但是,服务凭证提供的默认 JDBC URL 使用比我想使用的更宽容的超时。下面是默认的例子 JDBC URL:

jdbc:db2://1.1.1.1:50001/DBName:clientRerouteAlternateServerName=2.2.2.2;clientRerouteAlternatePortNumber=50001;sslConnection=true;

从各种实验来看,默认超时似乎是:

在主服务器突然不可用的故障情况下,现有连接将保持 "open",直到达到套接字读取超时。这会使该连接上的请求看起来有 "hung"。此外,由于默认连接超时为 2 分钟,任何建立新连接的尝试都需要 2 分钟或更长时间。

我想使用更小的超时来确保更高程度的应用程序可用性。我尝试自己调整各种 JDBC URL 参数,但我设法中断了几次故障转移。所以我虽然是时候问专家了:

我应该设置或更改哪些与 DB2 JDBC 超时相关的参数以控制初始连接超时和套接字读取超时(并且不中断到辅助服务器的故障转移)?

您需要设置几个重要的属性:

  • loginTimeout 为新的 JDBC 连接对象设置 打开套接字 到每个服务器的超时。
  • blockingReadConnectionTimeout 设置初始连接建立后从套接字读取的超时,当执行请求时。
  • commandTimeout 限制任何 SQL 请求可以执行的最长时间。

因此,您的 JDBC URL 将如下所示:

jdbc:db2://1.1.1.1:50001/DBName:clientRerouteAlternateServerName=2.2.2.2;clientRerouteAlternatePortNumber=50001;sslConnection=true;loginTimeout=10;blockingReadConnectionTimeout=10;commandTimeout=30;

前两个属性分别对于没有与服务器的网络连接或在请求过程中失去与服务器的网络连接的情况很重要。

设置 commandTimeout 是一种很好的做法,但这样做也会遇到极端情况:如果您在请求过程中失去与服务器的连接,在 blockingReadConnectionTimeout到达时,连接将尝试打开到服务器的新套接字连接。可惜没有属性设置打开新socket的超时时间[1],所以使用默认的OS超时时间(一般在2分钟左右) Linux) 除非 你设置了 commandTimeout。在这种情况下,它将使用剩余时间作为打开新套接字的超时时间。

如果你真的想亲自动手,你可以观察所有这些行为,当 enabling trace logging 在驱动程序中使用各种超时并在不同点模拟网络故障(阻塞网络流量)时使用驱动程序。

可以找到所有 JDBC 属性的文档 here

[1] 这主要是由于在故障期间,此时驱动程序的 Connection 对象未关闭。

看到这个link

https://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.1.0/com.ibm.db2.udb.apdv.java.doc/doc/rjvdsprp.htm

它有所有的属性描述,帮助你理解

blockingReadConnectionTimeout 连接套接字读取超时之前的时间量(以秒为单位)。此 属性 仅适用于 JDBC 和 SQLJ 类型 4 连接的 IBM DB2 驱动程序,并影响成功建立连接后发送到数据库服务器的所有请求。默认值为 0。值为 0 表示没有超时。