2014-12-02 64 views
1

我們有一個由Apache Aries在保險絲結構中包裝的OracleXADataSource(如this article)。如果我繼續發送大量的請求到服務器,它開始拋出以下錯誤:保險絲分佈式tx管理器不會釋放數據庫會話

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

當我檢查使用下面的查詢會話,在甲骨文每個請求後,它不斷出現下數量增加當前利用率

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

大多數針對此問題提出建議說,增加過程會議在甲骨文的限制,但這會暫時解決問題,直到我們達到一定的負載我我很擔心。

我發現/試過以下到目前爲止:

  • Perodically當負荷增加(或一定量的時間花費)的會話過程得到一個更大的量減小(100-200 )。 (我猜Geronimo會定期發佈會話)。而此時被釋放了一些會議的同時,交易活躍欄顯示相同金額:

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

  • 如果我關閉保險絲,該過程值回到初始大小立即(所以問題在客戶端)
  • 如果我關閉分佈式事務支持,那麼一切都很好,進程根本不增加
  • 我嘗試將池添加到OracleXADataSource,但沒有任何更改(已過時,但我認爲它仍然有效。我們沒有UCP罐子不幸的是,這樣我就可以不與測試)

    <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> 
    

回答

0

使用白羊很遺憾我無法解決此問題。我認爲它是一個錯誤。不過,我設法使用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>