1

我们使用来自 spring-data 的 Oracle AQ 支持在同一数据源上同时使用 JMS 和 JDBC,使用本地事务而不是 XA。我们设置的大图基本上是参考手册中描述的:关于 orcl:aq-jms-connection-factory: use-local-data-source-transaction="true" 和 native-jdbc-extractor="oracleNativeJdbcExtractor “ HibernateTransactionManager(我现在正在尝试将单个数据源(DBCP2 基本数据源)用于 AQ 和 Hibernate)。我正在使用 Camel JMS 组件(通过使用来自 spring 的 hibernate 事务管理器和连接工厂)进行 JMS 操作。一切正常,但几分钟后,我们得到指示 JDBC 连接池已用尽并且一切都卡住了。在 JDBC 连接池监视器中,我们可以看到所有正在使用的连接:所以显然有些东西正在泄漏连接。几分钟后用尽游泳池。同样的帖子在这里: https://jira.spring.io/browse/DATAJDBC-8

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

1 回答 1

0

我们在 Tomcat 8 中使用 DBCP 时遇到了同样的问题。原因是数据源默认不允许访问底层的原生连接。执行本机连接提取的代码实际上并没有失败,而是继续返回一个包装的连接,而不是本机 oracle 连接。这个本机连接被包装在一个代理中,用于将关闭传递回包装的连接。当 Oracle AQ 代码尝试在连接上调用 oracle 特定方法时,此代理失败,AQ 中止但泄漏连接。修复方法是通过在 DBCP 配置中使用 accessToUnderlyingConnection=true 来允许访问本机连接。

于 2016-05-25T23:00:18.387 回答