1

Wir verwenden die Oracle AQ-Unterstützung von spring-data, um sowohl JMS als auch JDBC über die gleiche Datenquelle mit lokalen Transaktionen anstelle von XA zu haben. Das große Bild unseres Setups ist im Wesentlichen das, was im Referenzhandbuch beschrieben ist: in der orcl: aq-jms-Verbindungsfabrik: use-local-data-source-transaction = "true" und native-jdbc-extractor = " oracleNativeJdbcExtractor " HibernateTransactionManager (Ich versuche, Single DataSource (DBCP2 Basisdatenquelle) jetzt für AQ und Hibernate zu verwenden). Ich verwende camel JMS-Komponente (mit Hibernate-Transaktionsmanager und Verbindungsfactory von Frühjahr) für JMS-Operationen. Alles funktioniert, aber nach ein paar Minuten bekommen wir Hinweise, dass der JDBC Verbindungspool erschöpft ist und alles hängen geblieben ist. Im JDBC-Verbindungspool-Monitor konnten wir sehen, dass alle Verbindungen in Verwendung waren: So gab es eindeutig Verbindungen. Erschöpfter Pool nach einigen Minuten. Same Beitrag ist hier: https://jira.spring.io/browse/DATAJDBC-8JDBC-Verbindungsleck im JDBC-Pool bei Verwendung von AQ

We are using: 
DBCP2 Basic datasource, 
Hibernate 4, 
Spring 4 Hibernate Transaction Manager, 
Spring Data Oracle Aq, 
JBOSS 6 EAP container. 

<orcl:aq-jms-connection-factory id="connectionFactory" 
     use-local-data-source-transaction="true" 
     native-jdbc-extractor="dbcpNativeJdbcExtractor" 1 
     data-source="dataSource" /> 

    <bean id="dbcpNativeJdbcExtractor" 
     class="org.springframework.jdbc.support.nativejdbc. OracleJdbc4NativeJdbcExtractor"/> 

    <bean id="dbcpDataSource" class="org.apache.commons.dbcp.BasicDataSource" 
      destroy-method="close"> 
     <property name="driverClassName" value="${jdbc.driverClassName}" /> 
     <property name="url" value="${jdbc.url}" /> 
     <property name="username" value="${jdbc.username}" /> 
     <property name="password" value="${jdbc.password}" /> 
    </bean> 

<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

<bean id="jms" class="org.apache.camel.component.jms.JmsComponent"> 
     <property name="connectionFactory" ref="connectionFactory"/> 
     <property name="transacted" value="true"/> 
     <property name="transactionManager" ref="txManager"/> 
    </bean> 

Any ideas? Thank you. 
+1

Haben Sie einen Quellcode? – ibre5041

+0

nur Quellcode hinzugefügt. Vielen Dank. – integrationarchitect

Antwort

0

Wir hatten das gleiche Problem mit DBCP in Tomcat 8. Der Grund ist, dass die Datenquelle nicht standardmäßig Zugriff auf die zugrunde liegenden nativen Verbindung zulässt. Der Code, der die Extraktion der systemeigenen Verbindung durchführt, schlägt nicht tatsächlich fehl, sondern gibt weiterhin eine umbrochene Verbindung und keine native Oracle-Verbindung zurück. Diese native Verbindung wird in einen Proxy eingebunden, um die Verbindung zurück zu der umschlossenen Verbindung herzustellen. Wenn der Oracle AQ-Code versucht, oracle-spezifische Methoden für die Verbindung aufzurufen, schlägt dieser Proxy fehl, und AQ bricht ab, verliert jedoch die Verbindung. Die Fehlerbehebung besteht darin, den Zugriff auf die systemeigene Verbindung zuzulassen, indem Sie in Ihrer DBCP-Konfiguration accessToUnderlyingConnection = true verwenden.