我有一个Spring集成流程,它从ActiveMQ桥接到OracleAQ。 请参阅GitHub下的示例项目 - https://github.com/cknzl2014/springio-ora-xa/tree/atomikos。
当我在没有XA的情况下运行它时,速度非常快。 使用XA,它每秒仅处理1到2条消息。 在分析应用程序时,我看到每条消息都建立了一个新的物理连接,并且在此基础上,在oracle db上发出了元数据查询。 但我不明白为什么会这样做,以及如何防止这种情况发生。
你们中的任何人都有使用OracleAQ和XA的经验吗? 这可能是XA事务管理器的问题(我使用Atomikos)?
感谢您的帮助, 克里斯
答案 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。