1

我正在使用 spring 数据源并且无法连接到 Oracle AQ 队列。

Connection connection = null;
                    AQSession aqSess = null;

                    connection = ds.getConnection();
                    connection.setAutoCommit(false);

                    DataSourceUtils.getTargetConnection(connection);
                    Class.forName("oracle.AQ.AQOracleDriver");

                    aqSess = AQDriverManager.createAQSession(connection);
                    aqSession = aqSess;

但仍然得到这个:oracle.jms.AQjmsException: JMS-112: Connection is invalid任何提示将不胜感激。

<bean id="myId" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
      <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
      <property name="url" value="jdbc:oracle:thin:@myIpAddress:dev"/>
      <property name="username" value="user"/>
      <property name="password" value="pass"/>
      <property name="removeAbandoned" value="true"/>
      <property name="initialSize" value="2"/>
      <property name="maxIdle" value="8"/>
      <property name="maxActive" value="30"/>
      <property name="maxWait" value="60000"/>
    </bean>


AQException: oracle.AQ.AQException: JMS-112: Connection is invalid
at oracle.AQ.AQDriverManager.createAQSession(AQDriverManager.java:193)
4

2 回答 2

1

Oracle AQ 不匹配BasicDataSource

OracleDataSource改为使用

但如果你想使用BasicDataSource

在许多应用服务器环境中,JDBC 连接被包装在一个特定于实现的类中,该类委托给底层的本地 JDBC 连接。Oracle 的 AQ 连接工厂需要本地 Oracle 连接,如果连接被外部类包装,则会抛出“oracle.jms.AQjmsException: JMS-112: Connection is invalid”异常。要解决此问题,您可以指定一个可用于解包连接的 NativeJdbcExtractor。Spring 提供了许多实现来匹配应用程序服务器环境。这是指定 NativeJdbcExtractor 的示例。

   <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.CommonsDbcpNativeJdbcExtractor"/>

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

https://docs.spring.io/spring-data/jdbc/old-docs/2.0.0.BUILD-SNAPSHOT/reference/html/orcl.streamsaq.html

于 2019-08-05T05:29:35.847 回答
0

我使用以下代码解决了我的问题:

OracleConnection oracleConnection = connection.unwrap(OracleConnection.class);

将其记录在这里作为答案,以防其他人在遇到类似问题时发现此问题。

于 2015-02-26T12:52:40.153 回答