使用XA从ActiveMQ到OracleAQ的性能较低的spring.io流

时间:2017-11-19 14:23:54

标签: spring-integration jta xa oracle-aq

我有一个Spring集成流程,它从ActiveMQ桥接到OracleAQ。 请参阅GitHub下的示例项目 - https://github.com/cknzl2014/springio-ora-xa/tree/atomikos

当我在没有XA的情况下运行它时,速度非常快。 使用XA,它每秒仅处理1到2条消息。 在分析应用程序时,我看到每条消息都建立了一个新的物理连接,并且在此基础上,在oracle db上发出了元数据查询。 但我不明白为什么会这样做,以及如何防止这种情况发生。

你们中的任何人都有使用OracleAQ和XA的经验吗? 这可能是XA事务管理器的问题(我使用Atomikos)?

感谢您的帮助, 克里斯

2 个答案:

答案 0 :(得分:1)

我们找到了解决问题的方法。 它包括四个步骤。

步骤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的情况下解决此问题。

非常感谢Dani Steinmann (stonie)寻求帮助!

P.S。:我在GitHub下更新了示例项目 - https://github.com/cknzl2014/springio-ora-xa/tree/atomikos

答案 1 :(得分:0)

首先,您应该确保使用pool进行JDBC连接。

另一方面,您可以考虑使用ChainedTransactionManager而不是XA用于两个目标交易管理员 - JMS and JDBC

另请参阅JDBC extensions项目中的一些信息。

该项目中也有一些Oracle AQ API