2017-11-19 16 views
2

ActiveMQからOracleAQに橋渡しするSpring統合フローがあります。 GitHub - https://github.com/cknzl2014/springio-ora-xa/tree/atomikosのサンプルプロジェクトを参照してください。ActiveMQからXAを使用したOracleAQへの低速パフォーマンスspring.ioの流れ

XAなしで実行すると、非常に高速です。 XAでは、1秒あたり1〜2メッセージしか処理しません。 アプリケーションをプロファイリングするときに、すべてのメッセージに対して新しい物理接続が確立されていることがわかります。これにより、oracle dbに対してメタデータ問合せが発行されます。 しかし、なぜこれがこれを行うのか、私はこれが起こるのを防ぐことができないのか分かりません。

誰もがOracleAQとXAの経験がありますか? これはXAトランザクションマネージャ(私はAtomikosを使用しています)に問題がありますか?あなたの助けのための

おかげで、すべての クリス

答えて

0

まず、あなたがJDBC接続にpoolを使用していることを確認する必要があります。

一方、2つのターゲット・トランザクション・マネージャー(JMS and JDBC)には、ChainedTransactionManagerはXA以外のものを使用することを検討することがあります。

JDBC extensionsプロジェクトの情報も参照してください。

また、そのプロジェクトにはOracle AQ APIもあります。

+0

私は[JMSとJDBC](https://www.javaworld.com/article/2077963/open-source-tools/distributed-transactions-in-spring--with-and-without-xa.html)を読んでいます。 )記事。とても興味深い。特に、私は_ベストエフォート1 PC_パターンが好きです。これははるかに高速ですが、冪等の受信機が必要です。 –

1

問題の解決方法が見つかりました。 これは4つのステップで構成されています。

手順1:最新のOracleの12cのクライアントライブラリを使用する
最新のOracleクライアントライブラリを使用して最初のステップイスト。 ojdbc8.jarに大幅な改善がありました。ストアドプロシージャを使用してメタデータを取得します。
これにより、スループットが約10ms/sに向上しました。

ステップ2:ための「自動コミット」の例外で

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

この設定だけでresultet:セットアップの接続は、第2のステップは、物品http://thinkfunctional.blogspot.ch/2012/05/atomikos-and-oracle-aq-pooling-problem.htmlに応じて、接続プーリングを向上して、正しく
プールOracle接続。/

-DautoCommit=false 

をしかし、スループットが2 MSG 1に下って行った:

ステップ3:偽
第三工程に自動コミットセット(https://docs.oracle.com/database/121/JAJDB/oracle/jdbc/OracleConnection.html#CONNECTION_PROPERTY_AUTOCOMMITを参照)は、以下のJavaシステム・プロパティを設定することでしたもう一度。

手順4:oracle.jdbcを設定します。autoCommitSpecCompliant
falseに最後のステップは、(https://docs.oracle.com/database/121/JAJDB/oracle/jdbc/OracleConnection.html#CONNECTION_PROPERTY_AUTO_COMMIT_SPEC_COMPLIANTを参照)次のJavaシステムプロパティを設定することでした:

-Doracle.jdbc.autoCommitSpecCompliant=false 

は、今、私たちは80件のMSG/sのスループットを取得します。 falseに

結論
oracle.jdbc.autoCommitSpecCompliantの設定はエレガントではありませんが、問題を解決しました。 oracle.jdbc.autoCommitSpecCompliantをfalseに設定せずにこの問題を回避するには、さらに調査する必要があります。

多くのおかげで助けをDani Steinmann (stonie)

P .:私はGitHub-https://github.com/cknzl2014/springio-ora-xa/tree/atomikosでサンプルプロジェクトを更新しました。

関連する問題