首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Jboss AS7连接池不会重新连接

Jboss AS7连接池不会重新连接
EN

Stack Overflow用户
提问于 2015-08-14 13:40:33
回答 2查看 5.7K关注 0票数 5

我的standalone.xml中有以下配置

代码语言:javascript
运行
复制
<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更改为xa-datasource(保持配置不变),那么就会工作

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

“默认”datasource似乎在调整连接池的大小方面也有问题。有时候,不管应用程序的负载如何,它会打开100多个连接(即使限制是100),并在几秒钟后关闭它们。这是很难再现的-因为它似乎是随机的,所以,我不能肯定,切换到xa-datasource也解决了这个问题。

现在:

  • 为什么要切换到xa-datasource呢?
  • 这样做意味着什么?
  • 为什么连接池会像这样疯狂?

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

  1. 启动postgres和应用服务器;
  2. 对申请做一些要求;
  3. 停止数据库;
  4. 对应用程序执行一些请求--并确保它们无法工作,因为它无法打开任何连接;
  5. 重新启动数据库;
  6. 对应用程序执行一些请求

在最后一步中,xa-datasource可以重新连接postgres,一切都正常。datasource不能,而且永远失败,加载并不重要--我必须重新启动应用服务器。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-15 10:01:17

在配置jboss时要记住的一件事是,有时最好的文档是在各个组件的项目中。在数据源设置的情况下,我总是告诉人们检查IronJacamar文档:单一/

对于您想要做的事情,这些设置应该有效:

代码语言:javascript
运行
复制
<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>
票数 6
EN

Stack Overflow用户

发布于 2015-08-15 14:27:50

我想你错过了:<check-valid-connection-sql>select 1</check-valid-connection-sql> in <validation>部分

PS

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32011550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档