JMS 112 Неверное соединение с использованием пружины DS
Я использую источник данных Spring и не могу подключиться к Oracle AQ Queue.
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)
1 ответ
Я исправил свою проблему, используя следующий код:
OracleConnection oracleConnection = connection.unwrap(OracleConnection.class);
Запишите его здесь в качестве ответа на тот случай, если другие найдут этот вопрос при наличии аналогичной проблемы.
Oracle AQ не совпадает с BasicDataSource
использованиеOracleDataSource
вместо
но если вы хотите использовать BasicDataSource
:
Во многих средах серверов приложений соединение JDBC заключено в класс, специфичный для реализации, который делегирует базовое собственное соединение JDBC. Фабрика соединений Oracle AQ нуждается в собственном соединении Oracle и выдает исключение "oracle.jms.AQjmsException: JMS-112: Соединение недопустимо", если соединение обернуто сторонним классом. Чтобы решить эту проблему, вы можете указать 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>