Spring integration 使用XA从ActiveMQ到Oracleq的spring.io性能较慢

Spring integration 使用XA从ActiveMQ到Oracleq的spring.io性能较慢,spring-integration,jta,xa,oracle-aq,Spring Integration,Jta,Xa,Oracle Aq,我有一个Spring集成流程,它将ActiveMQ连接到Oracleq。 请参阅GitHub-下的示例项目 当我在没有XA的情况下运行它时,速度非常快。 对于XA,它每秒只处理1到2条消息。 在分析应用程序时,我看到每个消息都会建立一个新的物理连接,并据此在oracle db上发出元数据查询。 但我不明白它为什么会这样,我如何才能防止这种情况发生 你们当中有人有Oracleq和XA的经验吗? 这可能是XA事务管理器(我使用Atomikos)的问题吗 谢谢你的帮助, Chris首先,您应该确保使用

我有一个Spring集成流程,它将ActiveMQ连接到Oracleq。 请参阅GitHub-下的示例项目

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

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

谢谢你的帮助,
Chris

首先,您应该确保使用JDBC连接

另一方面,您可以考虑使用两个目标事务管理器的<代码> ChaneDeTraceMeungMedis/Cuth.IsNTEAD两个目标事务管理器.< /P> 另请参见项目中的一些信息


该项目中也有一些问题。

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

步骤1:使用最新的Oracle客户端库
第一步是使用最新的Oracle 12c客户端库。 ojdbc8.jar中有显著的改进,例如,他们现在使用存储过程来获取元数据。
这将吞吐量提高到约10 msgs/s

步骤2:正确设置连接池
第二步是根据第条改进连接池:

但随后吞吐量又下降到1到2 msg/s

步骤4:将oracle.jdbc.autoCommitSpecCompliant设置为false
最后一步是设置以下java系统属性(请参阅):

现在我们的吞吐量为80毫秒/秒

结论
oracle.jdbc.autoCommitSpecCompliant
设置为false并不优雅,但解决了问题。 我们必须进一步调查,看看如何在不将
oracle.jdbc.autoCommitSpecCompliant
设置为false的情况下绕过这个问题

非常感谢您的帮助

附言:我更新了GitHub-下的示例项目。

我读了这篇文章。非常有趣。特别是我喜欢Best Effitures 1 PC模式,它速度更快,但需要幂等接收器。
<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>
-DautoCommit=false
-Doracle.jdbc.autoCommitSpecCompliant=false