1

我们有一个由 Apache Aries 在 Fuse Fabric 中包装的 OracleXADataSource(如 本文所示)。如果我继续向服务器发送大量请求,它会开始抛出以下错误:

Caused by: java.sql.SQLException: Listener refused the connection with the following error:
ORA-12519, TNS:no appropriate service handler found

当我使用以下查询检查会话时,在 Oracle 中的每个请求之后,它在当前利用率下不断显示增加的数字。

select resource_name, current_utilization, max_utilization, limit_value 
from v$resource_limit 
where resource_name in ('sessions', 'processes', 'transactions');

CURRENT_UTILIZATION MAX_UTILIZATION LIMIT_VALUE processes 545 768 800 sessions 553 774 1222 transactions 0 0 UNLIMITED

这个问题的大多数建议都说增加 Oracle 中的进程会话限制,但这会暂时解决问题,直到我们达到一定的负载,我很害怕。

到目前为止,我发现/尝试了以下内容:

  • 周期性地,当负载增加(或花费一定的时间)时,会话进程会以更大的数量(100-200)减少。(我猜 Geronimo 会定期发布会话)。在释放多个会话的同时,活跃事务列显示相同的数量:

CURRENT_UTILIZATION MAX_UTILIZATION LIMIT_VALUE processes 355 768 800 sessions 363 774 1222 transactions 122 122 UNLIMITED

  • 如果我关闭 Fuse,进程值会立即恢复到初始大小(所以问题出在客户端)
  • 如果我关闭分布式事务支持,那么一切都很好,进程根本不会增加
  • 我尝试向 OracleXADataSource 添加池,但没有任何改变(它已被弃用,但我认为它仍然有效。不幸的是,我们没有UCP jar,所以我无法用它进行测试)

    <property name="connectionCachingEnabled" value="true"/>
    <property name="connectionCacheProperties">
        <props merge="default">
            <prop key="InitialLimit">1</prop>
            <prop key="MinLimit">1</prop>
            <prop key="MaxLimit">1</prop>
        </props>
    </property>
    
4

1 回答 1

0

不幸的是,我无法使用 Aries 解决这个问题。我认为这是一个错误。但是,我设法使用我强烈推荐的 Atomikos 使其正常工作。比使用 Aries 的内置自动代理行为更直接:您声明所有内容,以便了解实际发生的情况。

<bean id="transactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">
    <property name="forceShutdown" value="false" />
</bean>

<bean id="userTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"> 
   <property name="transactionTimeout" value="300" /> 
</bean> 

<bean id="jtaTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> 
   <property name="transactionManager" ref="transactionManager" /> 
   <property name="userTransaction" ref="userTransaction" /> 
</bean>

<bean id="dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean">
    <property name="uniqueResourceName" value="oracledb" />
    <property name="xaDataSource">
        <bean class="oracle.jdbc.xa.client.OracleXADataSource">
            <property name="URL" value="jdbc:oracle:thin:@${db.host}:${db.port}:${db.sid}"/>
            <property name="user" value="${db.schema}" />
            <property name="password" value="${db.password}" />
        </bean>
    </property>
</bean>
于 2015-03-27T21:35:59.130 回答