2014-12-02 11 views
1

У нас есть OracleXADataSource, который обернут Apache Aries в Fuse Fabric (как в this article). Если я продолжаю посылать много запроса на сервер, он начинает бросать следующее сообщение об ошибке:Предохранитель, распределенный менеджер tx, не выпускает сеансы DB

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, но это позволило бы решить проблему временно, пока мы не достигнем определенной нагрузки I» м страшно.

Я нашел/попробовал следующее до сих пор:

  • Perodically при увеличении нагрузки (или определенное количество времени, потраченного) сессию и процессах прибудут пониженную с большим количеством (100-200). (Думаю, Геронимо периодически выпускает сеансы). В то же время, когда число сеансов высвобождаются, активная колонка транзакций показывает ту же сумму:

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

я не мог решить эту проблему с помощью Овна, к сожалению. Я считаю это ошибкой. Однако мне удалось правильно работать с Atomicos, что я настоятельно рекомендую. Гораздо более прямолинейно, чем использование встроенного в Auto-proxy поведения Овна: вы объявляете все, чтобы вы знали, что на самом деле происходит.

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