两个 SQL 服务器之间的 EAP 6 数据源容错配置负载平衡?
EAP 6 datasource fault tolerant configuration load balancing between two SQL servers?
环境:Jboss EAP 6.4
我的独立数据源配置如下-ha.xml
<datasource jndi-name="java:jboss/datasources/localPrimaryDS" pool-name="IntegrationDS1" enabled="true" use-java-context="true" statistics-enabled="true">
<connection-url>jdbc:sqlserver://primarySqlServer;databaseName=HalfFat|jdbc:sqlserver://secondarySqlServer;databaseName=HalfFat</connection-url>
<driver>mssql</driver>
<url-delimiter>|</url-delimiter>
<pool>
<min-pool-size>5</min-pool-size>
<max-pool-size>100</max-pool-size>
<prefill>true</prefill>
<use-strict-min>true</use-strict-min>
<flush-strategy>IdleConnections</flush-strategy>
</pool>
<security>
<user-name>user</user-name>
<password>psswd</password>
</security>
<validation>
<validate-on-match>true</validate-on-match>
<background-validation>false</background-validation>
<background-validation-millis>60000</background-validation-millis>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker"></valid-connection-checker>
<exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLExceptionSorter"></exception-sorter>
</validation>
</datasource>
观察:
当两个 SQL 服务器都存在时,应用程序专门从主 sql 服务器实例获得 JDBC 连接。当我 paused/disabled 主 sql 服务器时,在应用程序级别我观察到断开的连接是 destroyed/new 连接是从辅助 sql 服务器实例获得的。一切如预期。但是,如果我 resumed/re-enabled 主 sql 服务器实例,我观察到两个连接的混合。
问题:
这在某种程度上是一种不受欢迎的行为,因为我希望该应用程序继续使用来自辅助数据库的连接,直到它失败。我可以在数据源上配置一些东西来禁用这个 "load balancing" 行为吗?
谢谢
原来 <use-strict-min>true</use-strict-min>
是导致问题的原因。根据 redhat,当 use-strict-min 设置为 true 时,一旦达到最小池大小(使用中 + 可用连接),空闲连接扫描将不会标记为关闭任何进一步的连接。因此,我假设,仍然有一些来自主数据库的连接未标记为关闭,并且取消暂停 SQL 服务器将使那些未清理的连接再次可用。
环境:Jboss EAP 6.4 我的独立数据源配置如下-ha.xml
<datasource jndi-name="java:jboss/datasources/localPrimaryDS" pool-name="IntegrationDS1" enabled="true" use-java-context="true" statistics-enabled="true">
<connection-url>jdbc:sqlserver://primarySqlServer;databaseName=HalfFat|jdbc:sqlserver://secondarySqlServer;databaseName=HalfFat</connection-url>
<driver>mssql</driver>
<url-delimiter>|</url-delimiter>
<pool>
<min-pool-size>5</min-pool-size>
<max-pool-size>100</max-pool-size>
<prefill>true</prefill>
<use-strict-min>true</use-strict-min>
<flush-strategy>IdleConnections</flush-strategy>
</pool>
<security>
<user-name>user</user-name>
<password>psswd</password>
</security>
<validation>
<validate-on-match>true</validate-on-match>
<background-validation>false</background-validation>
<background-validation-millis>60000</background-validation-millis>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker"></valid-connection-checker>
<exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLExceptionSorter"></exception-sorter>
</validation>
</datasource>
观察: 当两个 SQL 服务器都存在时,应用程序专门从主 sql 服务器实例获得 JDBC 连接。当我 paused/disabled 主 sql 服务器时,在应用程序级别我观察到断开的连接是 destroyed/new 连接是从辅助 sql 服务器实例获得的。一切如预期。但是,如果我 resumed/re-enabled 主 sql 服务器实例,我观察到两个连接的混合。
问题: 这在某种程度上是一种不受欢迎的行为,因为我希望该应用程序继续使用来自辅助数据库的连接,直到它失败。我可以在数据源上配置一些东西来禁用这个 "load balancing" 行为吗?
谢谢
原来 <use-strict-min>true</use-strict-min>
是导致问题的原因。根据 redhat,当 use-strict-min 设置为 true 时,一旦达到最小池大小(使用中 + 可用连接),空闲连接扫描将不会标记为关闭任何进一步的连接。因此,我假设,仍然有一些来自主数据库的连接未标记为关闭,并且取消暂停 SQL 服务器将使那些未清理的连接再次可用。