【问题标题】:JBoss dropping connection after 30 min idle (Jboss XA Datasource with Oracle)JBoss 在空闲 30 分钟后断开连接(使用 Oracle 的 Jboss XA 数据源)
【发布时间】:2017-08-11 09:56:11
【问题描述】:

我正在使用 wildfly-8.2.0.Final 和 oracle 12c 和 ojdbc6。我已经配置了 XA 数据源来连接 oracle 数据库。一旦服务器启动并忙碌,一切看起来都很好,但如果应用程序服务器空闲超过 30 分钟,我将低于异常:

调试信息:

DataBaseConnectionMgr.createNewProperties()() 失败原因代码 潜台词:异常消息:java.sql.SQLException: javax.resource.ResourceException:IJ000457:未选中的可抛出 managedConnectionReconnected() cl=org.jboss.jca.core.connectionmanager.listener.TxConnectionListener@401c2dca[state=DESTROYED 管理 连接=org.jboss.jca.adapters.jdbc.xa.XAManagedConnection@7a0249a7 连接句柄=0 lastUse=1489587052205 trackByTx=false 池=org.jboss.jca.core.connectionmanager.pool.strategy.OnePool@4581a705 mcp=SemaphoreArrayListManagedConnectionPool@6887a22d[pool=jdbc/oracle/IMCTXDataSource] xaResource=XAResourceWrapperImpl@3a0fa21c[xaResource=org.jboss.jca.adapters.jdbc.xa.XAManagedConnection@7a0249a7 pad=false overrideRmValue=false productName=Oracle productVersion=Oracle Database 12c 企业版发布 12.1.0.2.0 - 64 位生产,具有分区、真正的应用程序集群、自动存储管理、OLAP、高级分析和 真正的应用程序测试选项 jndiName=java:jboss/datasources/IMCTXDataSource] txSync=null] 异常堆栈跟踪: org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:154) com.unisys.trans.shared.util.jdbc.DataBaseConnectionMngr.createNewProperties(DataBaseConnectionMngr.java:515)

<xa-pool>
    <min-pool-size>1</min-pool-size>
    <max-pool-size>30</max-pool-size>
    <prefill>false</prefill>
    <use-strict-min>false</use-strict-min>
    <flush-strategy>FailingConnectionOnly</flush-strategy>
    <is-same-rm-override>false</is-same-rm-override>
    <no-tx-separate-pools>true</no-tx-separate-pools>
    <pad-xid>false</pad-xid>
    <wrap-xa-resource>true</wrap-xa-resource>
</xa-pool>

【问题讨论】:

    标签: oracle jdbc jboss


    【解决方案1】:

    我知道终止空闲连接的三种机制。

    1) Jboss 空闲超时分钟数。您没有设置它,它的默认值为 15 分钟。 (最不可能的)

    2) sqlnet.ora中配置EXPIRE_TIME sqlnet.ora expiretime

    3) oracle db 用户配置文件的配置。 create profile

    您必须在配置文件配置中检查 idle_time。

    select * from dba_profiles where PROFILE = (SELECT profile FROM dba_users WHERE USERNAME =user);
    

    【讨论】:

    • 我通过 Jboss idle-timeout-minutes 尝试过。但它不会释放数据库中的锁,我正在使用 Bitronix 事务管理器。
    【解决方案2】:

    1#如果未启用,建议使用以下数据源连接验证机制:

    <validation>
          <validate-on-match>true</validate-on-match>
          <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"></valid-connection-checker>
         <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"></exception-sorter>
    </validation>
    

    2#

    <xa-pool>
          ...
         <is-same-rm-override>false</is-same-rm-override>
          <no-tx-separate-pools />
    </xa-pool>
    

    3#flush-strategy = IdleConnections

    4#use-fast-fail = true(立即获得新的物理连接)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      • 2021-08-10
      • 2019-08-23
      • 2018-11-14
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      相关资源
      最近更新 更多