I am using Spring to access oracle AQ.
I am getting following errors on startup, if I use JNDI based datasource in Tomcat/Webshpere server. Can anyone please guide me how I can solve this issue?
Cause: Error creating the db_connection; nested exception is java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp2.PoolingDataSource$PoolGuardConnectionWrapper cannot be cast to oracle.jdbc.internal.OracleConnection
Whereas in Websphere server, it gives following error
[ERROR ] Could not refresh JMS Connection for destination 'Q_AQ_EVENT' - retrying using FixedBackOff{interval=5000, currentAttempts=2, maxAttempts=unlimited}.
Cause: Error creating the db_connection; nested exception is java.lang.ClassCastException: com.ibm.ws.rsadapter.jdbc.WSJdbcConnection incompatible with oracle.jdbc.internal.OracleConnection
Following are my configs JNDI
<Resource name="jdbc/DB-ORA" auth="Container"
type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@domain.com:1521:ORCL"
username="XXXX" password="XXXX" maxTotal="20" maxIdle="10"
maxWaitMillis="-1" accessToUnderlyingConnectionAllowed="true"/>
Spring(v 3.2.17 & 4.2.6) Bean definitions
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/DB-ORA" />
</bean>
<bean id="dbcpNativeJdbcExtractor"
class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"/>
<orcl:aq-jms-connection-factory id="connectionFactory" native-jdbc-extractor="dbcpNativeJdbcExtractor" data-source="dataSource" />
Following are other related dependencies
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-oracle</artifactId>
<version>1.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.jms</groupId>
<artifactId>javax.jms-api</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>aqapi</artifactId>
<version>11.2.0</version>
</dependency>
My program works fine if I use org.springframework.jdbc.datasource.DriverManagerDataSource
OR oracle.jdbc.pool.OracleConnectionPoolDataSource
datasource
Our restriction is that we want to use JNDI based datasource.
P.S. Contrary to question how to cast dbcp connection to oracle connection?, I dont have handle on database connection in this example. Everything is being handled by the Spring. In my example, I don't have any place where I can get Connection object and manually cast it.