2017-11-19 23 views
2

ActiveMQ에서 OracleAQ로 연결되는 Spring 통합 플로우가 있습니다. GitHub - https://github.com/cknzl2014/springio-ora-xa/tree/atomikos에서 예제 프로젝트를 참조하십시오.ActiveMQ에서 XA를 사용하는 OracleAQ 로의 느린 성능 spring.io 플로우

XA없이 실행하면 매우 빠릅니다. XA를 사용하면 초당 1-2 개의 메시지 만 처리합니다. 응용 프로그램을 프로파일 링 할 때마다 모든 메시지에 대해 새로운 물리적 연결이 설정되고 이에 따라 oracle db에서 메타 데이터 쿼리가 실행됩니다. 하지만 왜 이런 일을하는지, 어떻게 이런 일이 일어나지 않도록 할 수 있는지 이해할 수 없습니다.

누구나 OracleAQ 및 XA에 대한 경험이 있습니까? Atomikos를 사용하는 XA 트랜잭션 관리자에 문제가 있습니까? 당신의 도움에 대한

감사합니다, 모두의 크리스

답변

0

먼저 당신이 JDBC 연결에 pool를 사용하고 있는지 확인해야한다.

반면에 두 개의 대상 트랜잭션 관리자에 대해 ChainedTransactionManager은 XA가 아닌 것으로 생각할 수 있습니다 (JMS and JDBC).

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)를 읽었습니다.) 기사. 매우 흥미로운. 특히 _Best Efforts 1 PC_ 패턴은 훨씬 빠르지 만 멱등 한 수신기가 필요합니다. –

1

문제의 해결책을 찾았습니다. 네 단계로 구성됩니다.

1 단계 : 최신 오라클 12C 클라이언트 라이브러리를 사용하는 최신 오라클 클라이언트 라이브러리
에게 첫 번째 단계는 인도 표준시를 사용합니다. 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 : 설치 연결 두 번째 단계는 기사 http://thinkfunctional.blogspot.ch/2012/05/atomikos-and-oracle-aq-pooling-problem.html에 따라 연결 풀링을 개선하고 제대로
풀링 오라클 연결./

-DautoCommit=false 

을하지만 처리량은 2 MSG 1로 내려 갔다 :

3 단계 : 거짓
세 번째 단계로 자동 커밋 설정은 (https://docs.oracle.com/database/121/JAJDB/oracle/jdbc/OracleConnection.html#CONNECTION_PROPERTY_AUTOCOMMIT 참조) 다음과 같은 자바 시스템 속성을 설정하는 것이 었습니다 다시.

4 단계 : oracle.jdbc를 설정하십시오.

-Doracle.jdbc.autoCommitSpecCompliant=false 

이제 우리는 80 MSG를/s의 처리량을 얻을 : 거짓

마지막 단계에 autoCommitSpecCompliant은 ( https://docs.oracle.com/database/121/JAJDB/oracle/jdbc/OracleConnection.html#CONNECTION_PROPERTY_AUTO_COMMIT_SPEC_COMPLIANT 참조) 다음과 같은 자바 시스템 속성을 설정하는 것이 었습니다.

결론
false로 oracle.jdbc.autoCommitSpecCompliant의 설정은 우아한 아니라, 문제를 해결했다. oracle.jdbc.autoCommitSpecCompliant을 false로 설정하지 않고이 문제를 해결할 수있는 방법을 더 조사해야합니다.

많은 도움을 주셔서 감사합니다. Dani Steinmann (stonie)!

P .: GitHub - https://github.com/cknzl2014/springio-ora-xa/tree/atomikos에서 샘플 프로젝트를 업데이트했습니다.