SQL 服务器的数据源 Microsoft JDBC 驱动程序(AlwaysOn 可用性组)
Datasource Microsoft JDBC Driver for SQL Server (AlwaysOn Availability Groups)
我有一个与从使用 Microsoft JDBC Driver 4.0
的 Java 应用程序连接到具有 AlwaysOn
可用性组以实现高可用性的 SQL Server 2014
的情况相关的问题.
通过此设置,我们将连接到可用性组侦听器(在数据库连接字符串中而不是任何特定实例中指定),以便侦听器优雅地处理数据库故障转移等,它如果当前主实例在 AG 集群中出现故障,则尝试连接到幕后的下一个可用实例。
我的问题是,
在j2ee应用服务器端配置的数据源中(我们使用WebSphere),那些已经被数据源池化的连接会发生什么?
当数据库出现故障时,虽然 AG 侦听器会尝试在数据库端重新连接到下一个可用的数据库,但 AG 侦听器是否也会通过 jdbc 驱动程序发送事件或在应用程序服务器上创建的数据源的某些内容,并确保丢弃那些已被数据源汇集的连接并让它创建新的连接,以便应用程序端的事务不会失败(尽管它们可能会持续一段时间直到创建新连接并且故障转移成功)或者 java 应用程序必须在从数据源请求后才能发现?
那个 SQL 服务器 JDBC 驱动程序的第 4 版是旧的,对永远在线功能一无所知。
任何数据源连接池都可以配置为在将连接发送给客户端之前检查池中的连接状态。如果无法使用连接,池将创建一个新连接。所有供应商和版本都是如此。我相信这是你能做的最好的。
WebSphere Application Server 能够处理不良连接并将它们从池中移除。发生这种情况的确切时间取决于一些可配置的选项以及 Microsoft JDBC 驱动程序充分利用 javax.sql.ConnectionEventListener API 向应用程序服务器发送通知的程度。在 JDBC 驱动程序立即为所有连接发送 connectionErrorOccurred 事件的理想情况下,WebSphere Application Server 通过从池中删除所有这些连接并将当前正在使用的任何连接标记为坏连接来做出响应,以便它一旦应用程序关闭句柄,就不会返回到池中。如果没有这个,WebSphere Application Server 将在应用程序下次使用时发现第一个坏连接。它是通过当时 JDBC 驱动程序发送的 connectionErrorOcurred 事件发现的,或者在检查异常的 SQLState/error 代码以了解已知的不良连接指标时发现的。 WebSphere Application Server 然后根据配置的清除策略从池中清除坏连接。有 3 个选项:
- 清除整个池的策略 - 从中删除所有连接
池和使用中的连接被标记为坏的,这样它们就不会
合并。
- 仅清除失败连接策略 - 仅
实际发生错误的特定连接是
从池中移除或标记为不良且未返回池
- 清除验证所有连接的策略 - 所有连接都是
测试有效性(Connection.isValid API)并找到联系
坏的从池中移除或标记为坏的而不是
回到游泳池。发现有效的连接保留在
池,继续使用。
根据您的描述,我不确定您使用的是传统的 WebSphere Application Server 还是 Liberty。如果是传统的,则有一个额外的选项用于预测试连接,因为它们从池中分发出来,但请注意,打开此选项可能会对性能产生影响。
也就是说,需要注意的一件事是,无论上述任何情况如何,您的应用程序始终需要能够处理由于连接不良导致的错误可能性(即使连接池已清除,连接也可能会变坏在使用中)并通过请求新连接并在新事务中重试该操作来响应。
我有一个与从使用 Microsoft JDBC Driver 4.0
的 Java 应用程序连接到具有 AlwaysOn
可用性组以实现高可用性的 SQL Server 2014
的情况相关的问题.
通过此设置,我们将连接到可用性组侦听器(在数据库连接字符串中而不是任何特定实例中指定),以便侦听器优雅地处理数据库故障转移等,它如果当前主实例在 AG 集群中出现故障,则尝试连接到幕后的下一个可用实例。
我的问题是,
在j2ee应用服务器端配置的数据源中(我们使用WebSphere),那些已经被数据源池化的连接会发生什么?
当数据库出现故障时,虽然 AG 侦听器会尝试在数据库端重新连接到下一个可用的数据库,但 AG 侦听器是否也会通过 jdbc 驱动程序发送事件或在应用程序服务器上创建的数据源的某些内容,并确保丢弃那些已被数据源汇集的连接并让它创建新的连接,以便应用程序端的事务不会失败(尽管它们可能会持续一段时间直到创建新连接并且故障转移成功)或者 java 应用程序必须在从数据源请求后才能发现?
那个 SQL 服务器 JDBC 驱动程序的第 4 版是旧的,对永远在线功能一无所知。
任何数据源连接池都可以配置为在将连接发送给客户端之前检查池中的连接状态。如果无法使用连接,池将创建一个新连接。所有供应商和版本都是如此。我相信这是你能做的最好的。
WebSphere Application Server 能够处理不良连接并将它们从池中移除。发生这种情况的确切时间取决于一些可配置的选项以及 Microsoft JDBC 驱动程序充分利用 javax.sql.ConnectionEventListener API 向应用程序服务器发送通知的程度。在 JDBC 驱动程序立即为所有连接发送 connectionErrorOccurred 事件的理想情况下,WebSphere Application Server 通过从池中删除所有这些连接并将当前正在使用的任何连接标记为坏连接来做出响应,以便它一旦应用程序关闭句柄,就不会返回到池中。如果没有这个,WebSphere Application Server 将在应用程序下次使用时发现第一个坏连接。它是通过当时 JDBC 驱动程序发送的 connectionErrorOcurred 事件发现的,或者在检查异常的 SQLState/error 代码以了解已知的不良连接指标时发现的。 WebSphere Application Server 然后根据配置的清除策略从池中清除坏连接。有 3 个选项:
- 清除整个池的策略 - 从中删除所有连接 池和使用中的连接被标记为坏的,这样它们就不会 合并。
- 仅清除失败连接策略 - 仅 实际发生错误的特定连接是 从池中移除或标记为不良且未返回池
- 清除验证所有连接的策略 - 所有连接都是 测试有效性(Connection.isValid API)并找到联系 坏的从池中移除或标记为坏的而不是 回到游泳池。发现有效的连接保留在 池,继续使用。
根据您的描述,我不确定您使用的是传统的 WebSphere Application Server 还是 Liberty。如果是传统的,则有一个额外的选项用于预测试连接,因为它们从池中分发出来,但请注意,打开此选项可能会对性能产生影响。 也就是说,需要注意的一件事是,无论上述任何情况如何,您的应用程序始终需要能够处理由于连接不良导致的错误可能性(即使连接池已清除,连接也可能会变坏在使用中)并通过请求新连接并在新事务中重试该操作来响应。