JDBC 驱动程序对高可用性和灾难恢复的支持

本主题介绍 Microsoft JDBC Driver for SQL Server 对于高可用性及灾难恢复（AlwaysOn 可用性组）的支持。有关 AlwaysOn 可用性组 的详细信息，请参阅 SQL Server 2012 联机丛书。

在 Microsoft JDBC Driver for SQL Server 4.0 版中，您可以先在连接属性中指定（高可用性、灾难恢复）可用性组 (AG) 的可用性组侦听器。如果将 Microsoft JDBC Driver for SQL Server 应用程序连接到具有故障转移功能的 AlwaysOn 数据库，则在故障转移后，会断开原始连接，并且该应用程序必须建立一个新的连接才能继续运行。

如果未连接到可用性组侦听器，并且如果有多个 IP 地址与某个服务器关联，则 Microsoft JDBC Driver for SQL Server 将尝试连接到第一个 IP 地址。如果 Microsoft JDBC Driver for SQL Server 无法建立与第一个 IP 地址的连接，则连接将失败。Microsoft JDBC Driver for SQL Server 将不会尝试连接到其后与该服务器关联的任何 IP 地址。连接到可用性组侦听器时，Microsoft JDBC Driver for SQL Server 将尝试建立与所有 IP 地址的并行连接，如果连接尝试成功，则驱动程序将丢弃所有挂起的连接尝试。

延长连接超时和实施连接重试逻辑将增加应用程序连接到可用性组的可能性。此外，由于连接可能会因可用性组的故障转移而失败，因此您应实施连接重试逻辑，重试失败的连接直到它重新连接。

Microsoft JDBC Driver 4.0 for SQL Server 中新增了以下连接属性：

- multiSubnetFailover

- applicationIntent

# MultiSubnetFailover 连接

连接到 SQL Server 2012 可用性组的可用性组侦听器或 SQL Server 2012 故障转移群集实例时，始终指定 multiSubnetFailover=true。multiSubnetFailover 使 SQL Server 2012 中所有可用性组和故障转移群集实例的故障转移速度更快，明显减少了单子网和多子网 AlwaysOn 拓扑的故障转移时间。多子网故障转移期间，客户端将尝试并行连接。单子网故障转移期间，Microsoft JDBC Driver for SQL Server 将积极地重试 TCP 连接。

multiSubnetFailover 连接属性指示将在可用性组还是故障转移群集实例中部署应用程序，还指示 Microsoft JDBC Driver for SQL Server 将通过连接到所有 IP 地址的尝试连接到主 SQL Server 实例上的数据库。为连接指定 MultiSubnetFailover=true 后，客户端将在比操作系统的默认 TCP 重传间隔更短的时间内重试 TCP 连接尝试。这使 AlwaysOn 可用性组或 AlwaysOn 故障转移群集实例进行故障转移之后重新连接的速度更快，并且该设置同样适用于单子网和多子网的可用性组和故障转移群集实例。

有关 Microsoft JDBC Driver for SQL Server 中的连接字符串关键字的详细信息，请参阅设置连接属性。

连接到可用性组侦听器或故障转移群集实例之外的内容时指定 multiSubnetFailover=true，可能会产生负面的性能影响，因此不支持执行此操作。

如果未安装安全管理器，默认情况下，Java 虚拟机将缓存虚拟 IP 地址 (VIP) 一段时间（由您的 JDK 实现和 Java 属性 networkaddress.cache.ttl 和 networkaddress.cache.negative.ttl 定义）。如果已安装 JDK 安全管理器，默认情况下，Java 虚拟机将缓存 VIP 且不会刷新缓存。您应将 Java 虚拟机缓存的“生存时间”(networkaddress.cache.ttl) 设置为“一天”。如果您未将默认生存时间更改为“一天（左右）”，则添加或更新 VIP 后，不会清除 Java 虚拟机缓存中的旧值。有关 networkaddress.cache.ttl 和 networkaddress.cache.negative.ttl 的详细信息，请参阅 http://download.oracle.com/javase/6/docs/technotes/guides/net/properties.html。

使用以下准则连接到可用性组或故障转移群集实例的服务器：

- 如果在同一连接字符串中使用 multiSubnetFailover 连接属性和 instanceName 连接属性，则驱动程序将生成一条错误。这反映一个事实：可用性组中未使用 SQL Browser。但如果另外指定了 portNumber 连接属性，则驱动程序将忽略 instanceName 而使用 portNumber。

- 连接到单子网或多子网时使用 multiSubnetFailover 连接属性，这二者的性能都会得到改进。

- 若要连接到可用性组，请在连接字符串中将可用性组的可用性组侦听器指定为服务器。例如，jdbc:sqlserver://VNN1。

- 连接到配置有 64 个以上 IP 地址的 SQL Server 实例将导致连接失败。

- 基于以下身份验证类型，使用 multiSubnetFailover 连接属性的应用程序的行为不受影响：SQL Server 身份验证、Kerberos 身份验证或 Windows 身份验证。

- 延长 loginTimeout 的值可调整故障转移时间，减少应用程序连接重试次数。

- 不支持分布式事务。

如果只读路由无效，则在以下情况下，连接到可用性组中的次副本位置将失败：

1. 在未将次副本位置配置为接受连接的情况下。

2. 在应用程序使用 applicationIntent=ReadWrite（将在下文中讨论）且次副本位置配置为只读访问的情况下。

如果主副本配置为拒绝只读工作负荷且连接字符串包含 ApplicationIntent=ReadOnly，则连接将失败。

# 从数据库镜像升级到使用多子网群集

如果要将当前使用数据库镜像的 Microsoft JDBC Driver for SQL Server 应用程序升级到多子网方案，则应删除 failoverPartner 连接属性，将其替换为设置为 true 的 multiSubnetFailover，并将连接字符串中的服务器名称替换为可用性组侦听器。如果连接字符串使用 failoverPartner 和 multiSubnetFailover=true，则驱动程序将生成一条错误。但如果连接字符串使用 failoverPartner 和 multiSubnetFailover=false（或 ApplicationIntent=ReadWrite），则应用程序将使用数据库镜像。

如果在 AG 的主数据库中使用数据库镜像，同时在连接到主数据库而不是可用性组侦听器的连接字符串中使用 multiSubnetFailover=true，则驱动程序将返回一条错误。

# 指定应用程序意向

如果 applicationIntent=ReadOnly，则在连接到已启用 AlwaysOn 的数据库时，客户端将请求只读工作负荷。在连接时以及运行“USE database”语句期间，服务器将强制实施该意向（但仅针对已启用 AlwaysOn 的数据库）。

applicationIntent 关键字对旧版只读数据库不起作用。

数据库可允许或禁止对目标 AlwaysOn 数据库的读取工作负荷。（这可以使用 PRIMARY_ROLE 语句和 SECONDARY_ROLE Transact-SQL 语句的 ALLOW_CONNECTIONS 子句来实现。）

applicationIntent 关键字可用于启用只读路由。

# 只读路由

只读路由是一项功能，可用于确保数据库的只读副本的可用性。启用只读路由：

1. 必须连接到“AlwaysOn 可用性组”可用性组侦听器。

2. applicationIntent 连接字符串关键字必须设置为 ReadOnly。

3. 数据库管理员必须将可用性组配置为启用只读路由。

使用只读路由的多个连接可能不会全部连接到同一个只读副本。更改数据库同步或服务器路由配置可能导致客户端连接到不同的只读副本。若要确保所有只读请求连接到同一只读副本，请勿将可用性组侦听器或虚拟 IP 地址传递给 serverName 连接字符串关键字。而应指定只读实例的名称。

因为只读路由首先连接到主副本，然后查找最适用的可读次副本，所以只读路由所需的时间可能会超过连接主副本的时间。因此，您应延长登录超时时间。

# 支持 multiSubnetFailover 和 applicationIntent 的新增方法

利用下列方法，您可以编程方式访问 multiSubnetFailover 和 applicationIntent 连接字符串关键字：

- SQLServerDataSource.getApplicationIntent

- SQLServerDataSource.setApplicationIntent

- SQLServerDataSource.getMultiSubnetFailover

- SQLServerDataSource.setMultiSubnetFailover

- SQLServerDriver.getPropertyInfo

此外，已向 SQLServerDataSource 类、SQLServerConnectionPoolDataSource 类 和 SQLServerXADataSource 类 添加了 getMultiSubnetFailover、setMultiSubnetFailover、getApplicationIntent 和 setApplicationIntent 方法。

# SSL 证书验证

可用性组包含多个物理服务器。Microsoft JDBC Driver 4.0 for SQL Server 新增了对 SSL 证书中的 Subject Alternate Name 的支持，因此多台主机可与同一个证书关联。有关 SSL 的详细信息，请参阅了解 SSL 支持。

# 请参阅

设置连接属性
通过 JDBC 驱动程序连接到 SQL Server
发送有关本主题的反馈至 Microsoft。

© 2012 Microsoft。保留所有权利。