连接复原 (JDBC)
通过连接复原,在限定范围内,中断的空闲连接可重新连接。 如果初始连接失败,通过连接复原,还可让驱动程序自动重试连接。 仅 SQL Server 2014 及更高版本和 Azure SQL 数据库支持重新连接中断的空闲连接。 此功能从 Microsoft JDBC Driver 10.2.0 for SQL Server 开始提供。
连接重试
连接复原能力包括两个方面。 第一个是能够以透明方式重试初始数据库连接。 第二个是能够以透明方式恢复现有的空闲连接。 典型的空闲连接可能是连接池中的一个连接。 “空闲”连接通常是指空闲至少 30 秒的连接。 这些连接通常可能由服务器,或客户端和服务器之间的网络设备关闭。
JDBC 驱动程序提供了两个用于控制连接复原行为的连接选项。 可以将这些选项添加到连接字符串中,或通过数据源属性设置这些选项。
关键字 | 值 | 默认值 | 说明 |
---|---|---|---|
connectRetryCount |
介于 0 和 255 之间(含限值)的整数 | 1 | 在放弃尝试之前,尝试建立或重建连接的最大次数。 默认情况下,将重试一次。 值为 0 表示不会尝试重试。 |
connectRetryInterval |
介于 1 和 60 之间(含限值)的整数 | 10 | 连接重试的间隔时间(以秒为单位)。 驱动程序在检测到空闲连接断开后立即尝试重新连接,然后在等待 connectRetryInterval 秒后重试。 如果 connectRetryCount 为 0,则忽略此关键字。 |
如果 connectRetryCount
乘以 connectRetryInterval
的乘积大于 loginTimeout
,那么一旦达到 loginTimeout
,驱动程序将停止尝试连接。 否则,将继续尝试重新连接,直到达到 connectRetryCount
。
连接恢复
为了检测中断的空闲连接,驱动程序依赖于套接字级别的 TCP keepalive 包。 在 Linux 和 Java 11+ 上,当出现故障 (KeepAliveInterval
) 时,驱动程序会自动启用 keepalive 数据包,且重试间隔时间为 30 秒 (KeepAliveTime
),延迟为 1 秒。
重要
在 Windows 和 macOS 上,或在 Java 8 上,必须在操作系统中手动配置 keepalive,以便充分利用断开的空闲连接的还原。 有关如何配置 keepalive 的信息,请参阅连接到 Azure SQL 数据库。
限制
在以下情况下,无法还原中断的空闲连接:
- 存在尚未完全分析或缓冲的打开的结果集
- 针对 Azure SQL 切换数据库
- 存在打开的事务