Jboss AS7连接池不会重新连接

时间:2015-08-14 13:40:33

标签: java postgresql jboss7.x

我的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无法重新连接,我必须重新启动应用服务器。

但是,如果我使用datasource驱动程序将xa-datasource更改为org.postgresql.xa.PGXADataSource(保留示例中的配置),就可以

事情是:我无法理解这一点。如果我错了,请纠正我,但xa-datasources应该用于在多个数据库中同步提交,而这不是这里的情况。我实际上配置了多个数据库,但我不需要同步它们之间的事务。

&#34;默认&#34; datasource似乎也存在调整连接池大小的问题。有时候,对应用程序的负载并不重要,它会打开超过100个连接(即使限制为100)并在几秒钟后关闭它们。这很难重现 - 因为它似乎是随机的,所以,我无法确定切换到xa-datasource也能解决这个问题。

现在:

  • 为什么切换到xa-datasource有效?
  • 这样做的含义是什么?
  • 为什么连接池会像这样疯狂?

为了澄清,我的测试包括:

  1. 启动postgres和app服务器;
  2. 向应用程序提出一些请求;
  3. 停止数据库;
  4. 向应用程序提出一些请求 - 并发现它们无法正常工作,因为它无法打开任何连接;
  5. 再次启动数据库;
  6. 向应用程序提出一些请求
  7. 在最后一步中,xa-datasource可以重新连接postgres,一切正常。 datasource无法永久失败,加载并不重要 - 我必须重新启动应用服务器。

1 个答案:

答案 0 :(得分:1)

我认为您错过了<check-valid-connection-sql>select 1</check-valid-connection-sql>部分中的<validation>

PS

PostgreSQLValidConnectionChecker.isValidConnection向postgres发送空查询stmt.execute("");我认为postgres驱动程序只是忽略它。 XA连接很可能发送一些系统SQL语句来支持XA事务并获得SQLException。