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



SQLDB Bluemix Service的高级计划支持DB2高可用性。但是,服务凭据提供的默认JDBC URL使用了比我希望使用的更多的宽容超时。下面是默认JDBC URL的一个示例:

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

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

  • 初始连接超时时间: 2分钟
  • socket read timeout:操作系统的默认值。我读到过可能超过一个小时。

在主服务器突然不可用的故障场景中,现有连接将保持"打开"状态,直到达到套接字读取超时。这可以使该连接上的请求看起来已经"挂起"。此外,由于默认的连接超时时间为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之后,该连接将尝试打开到服务器的新套接字连接。不幸的是,没有属性来设置打开新套接字的超时时间[1],因此使用默认的操作系统超时时间(在Linux中通常约为2分钟),除非设置了commandTimeout。在这种情况下,它将使用剩余的时间作为打开新套接字的超时时间。

如果您真的想亲自动手,您可以通过在驱动程序中启用跟踪日志记录并在使用驱动程序时在不同点模拟网络故障(阻塞网络流量)来观察所有这些行为,以及何时使用各种超时。

所有JDBC属性的文档可以在这里找到。

[1]这主要是由于在故障期间的这一点,驱动程序的Connection对象没有关闭。

查看此链接

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

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

blockingReadConnectionTimeout连接套接字读取超时前的秒数。此属性仅适用于用于JDBC和SQLJ type 4连接的IBM DB2 Driver,并影响成功建立连接后发送到数据库服务器的所有请求。默认值为0。值为0表示没有超时

最新更新