使用AQ时JDBC连接上的JDBC连接泄漏

时间:2016-03-26 18:48:16

标签: hibernate connection-pooling apache-commons-dbcp oracle-aq

我们正在使用spring-data的Oracle AQ支持在同一数据源上同时拥有JMS和JDBC,而不是XA。  我们设置的大局基本上是参考手册中描述的:orcl:aq-jms-connection-factory:use-local-data-source-transaction =“true”和native-jdbc-extractor =“oracleNativeJdbcExtractor “  HibernateTransactionManager(我现在尝试使用单个DataSource(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.

1 个答案:

答案 0 :(得分:0)

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