Мы нашли решение проблемы. Он состоит из четырех шагов.
Шаг 1. Используйте новейшие клиентские библиотеки Oracle
Первый шаг – использование новейших клиентских библиотек Oracle 12c. В ojdbc8.jar были внесены значительные улучшения, например. теперь они используют хранимые процедуры для получения метаданных.
Это увеличило пропускную способность примерно до 10 msgs/s.
Шаг 2. Правильная настройка пула соединений
Вторым шагом было улучшение пула соединений в соответствии со статьей http://thinkfunctional.blogspot.ch/2012/05/atomikos-and-oracle-aq-pooling-problem.html:
<bean id="oraXaDataSource" primary="true"
class="oracle.jdbc.xa.client.OracleXADataSource" destroy-method="close">
<property name="URL" value="${oracle.url}" />
<property name="user" value="${oracle.username}" />
<property name="password" value="${oracle.password}" />
</bean>
<bean id="atomikosOraclaDataSource"
class="org.springframework.boot.jta.atomikos.AtomikosDataSourceBean">
<property name="uniqueResourceName" value="xaOracleAQ" />
<property name="xaDataSource" ref="oraXaDataSource" />
<property name="poolSize" value="5" />
</bean>
<bean id="OracleAQConnectionFactory" class="oracle.jms.AQjmsFactory" factory-method="getConnectionFactory">
<constructor-arg ref="atomikosOraclaDataSource" />
</bean>
Одна только эта конфигурация приводит к исключениям из-за «автоматической фиксации» соединения с Oracle.
Шаг 3. Установите для autoCommit значение false
Третьим шагом было задание следующего системного свойства Java (см. https://docs.oracle.com/database/121/JAJDB/oracle/jdbc/OracleConnection.html#CONNECTION_PROPERTY_AUTOCOMMIT):
-DautoCommit=false
Но затем пропускная способность снова упала до 1-2 msg/s.
Шаг 4. Установите для oracle.jdbc.autoCommitSpecCompliant значение false
Последним шагом была установка следующего системного свойства Java (см. https://docs.oracle.com/database/121/JAJDB/oracle/jdbc/OracleConnection.html#CONNECTION_PROPERTY_AUTO_COMMIT_SPEC_COMPLIANT):
-Doracle.jdbc.autoCommitSpecCompliant=false
Теперь мы получаем пропускную способность 80 msgs/s.
Заключение
Установка для oracle.jdbc.autoCommitSpecCompliant
значения false не является элегантной, но решает проблему. Мы должны продолжить расследование, чтобы увидеть, как мы можем обойти эту проблему, не устанавливая oracle.jdbc.autoCommitSpecCompliant
в false.
Большое спасибо Дани Штайнманн (stonie) за помощь! сильный>
P.S.: Я обновил пример проекта на GitHub — https://github.com/cknzl2014/springio-ora-xa/tree/atomikos.
person
Christoph K
schedule
24.11.2017