Jboss AS7 连接池不会重新连接
Jboss AS7 connection pool won't reconnect
我的 standalone.xml
中有以下配置:
<subsystem xmlns="urn:jboss:domain:datasources:1.1">
<datasources>
<datasource jta="true" jndi-name="java:/jdbc/myds" pool-name="CADS" enabled="true" use-java-context="true" use-ccm="true">
<connection-url>jdbc:postgresql://db.host/name</connection-url>
<driver>postgresql</driver>
<new-connection-sql>select 1</new-connection-sql>
<pool>
<min-pool-size>20</min-pool-size>
<max-pool-size>100</max-pool-size>
<flush-strategy>IdleConnections</flush-strategy>
</pool>
<security>
<user-name>user</user-name>
<password>pwd</password>
</security>
<validation>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker"/>
<exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter"/>
</validation>
<timeout>
<blocking-timeout-millis>30000</blocking-timeout-millis>
<idle-timeout-minutes>1</idle-timeout-minutes>
</timeout>
<statement>
<track-statements>true</track-statements>
</statement>
</datasource>
<drivers>
<driver name="postgresql" module="org.postgresql">
<xa-datasource-class>org.postgresql.Driver</xa-datasource-class>
</driver>
</drivers>
</datasources>
</subsystem>
如果由于某种原因,数据库停止响应一秒钟,JBoss 无法重新连接,我必须重新启动应用程序服务器。
但是,如果我使用 org.postgresql.xa.PGXADataSource
驱动程序将 datasource
更改为 xa-datasource
(保持示例中的配置), 它可以工作.
事实是:我无法理解这一点。如果我错了请纠正我,但是 xa-datasources
应该用于在多个数据库中同步提交,而这里不是这种情况。我实际上配置了多个数据库,但我不需要同步它们之间的事务。
"default" datasource
似乎在调整连接池大小方面也存在问题。有时,应用程序的负载无关紧要,它会打开超过 100 个连接(即使限制为 100 个)并在几秒钟后关闭它们。这很难重现 - 因为它看起来是随机的,所以,我不能确定切换到 xa-datasource
也能解决这个问题。
现在:
- 为什么切换到
xa-datasource
有效?
- 这样做的含义是什么?
- 为什么连接池会这样疯狂?
澄清一下,我的测试包括:
- 启动 postgres 和应用程序服务器;
- 向应用程序发出一些请求;
- 停止数据库;
- 向应用程序发出一些请求 - 发现它们没有工作,因为它无法打开任何连接;
- 再次启动数据库;
- 向应用程序发出一些请求
在最后一步中,xa-datasource
可以重新连接到 postgres,并且一切正常。 datasource
不能,永远失败,负载无关紧要 - 我必须重新启动应用程序服务器。
配置 jboss 时要记住的一件事是,有时最好的文档在各个组件的项目中。在数据源设置的情况下,我总是告诉人们查看 IronJacamar 文档:
http://www.ironjacamar.org/doc/userguide/1.0/en-US/html_single/
对于您想执行的操作,这些设置应该有效:
<validation>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker"/>
<exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter"/>
<!-- I don't know what this does but someone on my DevOps
team said to set it this way. :) -->
<validate-on-match>false</validate-on-match>
<!-- validate the connection using a background
thread rather than right before you try to use the connection -->
<background-validation>true</background-validation>
<!-- sets the frequency the background thread will check each connection.
The lower this setting, the quicker it will find a bad connection
but it will be more chatty sending the validations to the server -->
<background-validation-millis>60000</background-validation-millis>
<!-- fast fail will mark all the connections invalid as soon as
it finds a bad one. This will make it clear the pool quicker
if all connections are reset at once such as a restart. Fast
fail would be trouble though if you had a setup where the database
sometimes selectively kills a single connection, such as killing long
running queries. -->
<use-fast-fail>true</use-fast-fail>
</validation>
我认为您错过了:<validation>
部分中的 <check-valid-connection-sql>select 1</check-valid-connection-sql>
PS
PostgreSQLValidConnectionChecker.isValidConnection 向 postgres 发送空查询 stmt.execute("");
我认为 postgres 驱动程序只是忽略它。 XA 连接很可能会发送一些支持 XA 事务的系统 SQL 语句并得到 SQLException。
我的 standalone.xml
中有以下配置:
<subsystem xmlns="urn:jboss:domain:datasources:1.1">
<datasources>
<datasource jta="true" jndi-name="java:/jdbc/myds" pool-name="CADS" enabled="true" use-java-context="true" use-ccm="true">
<connection-url>jdbc:postgresql://db.host/name</connection-url>
<driver>postgresql</driver>
<new-connection-sql>select 1</new-connection-sql>
<pool>
<min-pool-size>20</min-pool-size>
<max-pool-size>100</max-pool-size>
<flush-strategy>IdleConnections</flush-strategy>
</pool>
<security>
<user-name>user</user-name>
<password>pwd</password>
</security>
<validation>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker"/>
<exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter"/>
</validation>
<timeout>
<blocking-timeout-millis>30000</blocking-timeout-millis>
<idle-timeout-minutes>1</idle-timeout-minutes>
</timeout>
<statement>
<track-statements>true</track-statements>
</statement>
</datasource>
<drivers>
<driver name="postgresql" module="org.postgresql">
<xa-datasource-class>org.postgresql.Driver</xa-datasource-class>
</driver>
</drivers>
</datasources>
</subsystem>
如果由于某种原因,数据库停止响应一秒钟,JBoss 无法重新连接,我必须重新启动应用程序服务器。
但是,如果我使用 org.postgresql.xa.PGXADataSource
驱动程序将 datasource
更改为 xa-datasource
(保持示例中的配置), 它可以工作.
事实是:我无法理解这一点。如果我错了请纠正我,但是 xa-datasources
应该用于在多个数据库中同步提交,而这里不是这种情况。我实际上配置了多个数据库,但我不需要同步它们之间的事务。
"default" datasource
似乎在调整连接池大小方面也存在问题。有时,应用程序的负载无关紧要,它会打开超过 100 个连接(即使限制为 100 个)并在几秒钟后关闭它们。这很难重现 - 因为它看起来是随机的,所以,我不能确定切换到 xa-datasource
也能解决这个问题。
现在:
- 为什么切换到
xa-datasource
有效? - 这样做的含义是什么?
- 为什么连接池会这样疯狂?
澄清一下,我的测试包括:
- 启动 postgres 和应用程序服务器;
- 向应用程序发出一些请求;
- 停止数据库;
- 向应用程序发出一些请求 - 发现它们没有工作,因为它无法打开任何连接;
- 再次启动数据库;
- 向应用程序发出一些请求
在最后一步中,xa-datasource
可以重新连接到 postgres,并且一切正常。 datasource
不能,永远失败,负载无关紧要 - 我必须重新启动应用程序服务器。
配置 jboss 时要记住的一件事是,有时最好的文档在各个组件的项目中。在数据源设置的情况下,我总是告诉人们查看 IronJacamar 文档: http://www.ironjacamar.org/doc/userguide/1.0/en-US/html_single/
对于您想执行的操作,这些设置应该有效:
<validation>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker"/>
<exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter"/>
<!-- I don't know what this does but someone on my DevOps
team said to set it this way. :) -->
<validate-on-match>false</validate-on-match>
<!-- validate the connection using a background
thread rather than right before you try to use the connection -->
<background-validation>true</background-validation>
<!-- sets the frequency the background thread will check each connection.
The lower this setting, the quicker it will find a bad connection
but it will be more chatty sending the validations to the server -->
<background-validation-millis>60000</background-validation-millis>
<!-- fast fail will mark all the connections invalid as soon as
it finds a bad one. This will make it clear the pool quicker
if all connections are reset at once such as a restart. Fast
fail would be trouble though if you had a setup where the database
sometimes selectively kills a single connection, such as killing long
running queries. -->
<use-fast-fail>true</use-fast-fail>
</validation>
我认为您错过了:<validation>
部分中的 <check-valid-connection-sql>select 1</check-valid-connection-sql>
PS
PostgreSQLValidConnectionChecker.isValidConnection 向 postgres 发送空查询 stmt.execute("");
我认为 postgres 驱动程序只是忽略它。 XA 连接很可能会发送一些支持 XA 事务的系统 SQL 语句并得到 SQLException。