Java 使用EclipseLink DCN会导致OracleChangeNotificationListener.register中出现ClassCastException
首先,我在Java 1.6上使用EclipseLink 2.5.2、ojdbc6、spring orm 4.1.1、QueryDSL 3.7.1和Tomcat7/Websphere 8 问题 当我尝试添加OracleChangeNotificationListener时,我的应用程序崩溃 有问题的路线是Java 使用EclipseLink DCN会导致OracleChangeNotificationListener.register中出现ClassCastException,java,spring,oracle,eclipselink,querydsl,Java,Spring,Oracle,Eclipselink,Querydsl,首先,我在Java 1.6上使用EclipseLink 2.5.2、ojdbc6、spring orm 4.1.1、QueryDSL 3.7.1和Tomcat7/Websphere 8 问题 当我尝试添加OracleChangeNotificationListener时,我的应用程序崩溃 有问题的路线是 OracleConnection connection = (OracleConnection) databaseSession.getServerPlatform()
OracleConnection connection = (OracleConnection) databaseSession.getServerPlatform()
.unwrapConnection(accessor.getConnection());
与
返回(在tomcat上)a
顺便说一句,这个补丁不适合我
persistence.xml
<persistence-unit name="xxxxContext" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/xxxx</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="eclipselink.weaving" value="static"/>
<property name="eclipselink.cache.database-event-listener" value="DCN"/>
</properties>
</persistence-unit>
org.eclipse.persistence.jpa.PersistenceProvider
jdbc/xxxx
假的
雄猫
Caused by: java.lang.ClassCastException: com.sun.proxy.$Proxy32 cannot be cast to oracle.jdbc.driver.OracleConnection
at org.eclipse.persistence.platform.database.oracle.dcn.OracleChangeNotificationListener.register(OracleChangeNotificationListener.java:96)
at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.postConnectDatasource(DatabaseSessionImpl.java:847)
at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.login(DatabaseSessionImpl.java:756)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:313)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:336)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:302)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.invokeProxyMethod(AbstractEntityManagerFactoryBean.java:388)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean$ManagedEntityManagerFactoryInvocationHandler.invoke(AbstractEntityManagerFactoryBean.java:541)
at com.sun.proxy.$Proxy13.createEntityManager(Unknown Source)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:283)
at com.sun.proxy.$Proxy19.getDelegate(Unknown Source)
at com.mysema.query.jpa.impl.JPAProvider.getTemplates(JPAProvider.java:66)
at com.mysema.query.jpa.impl.JPAQuery.<init>(JPAQuery.java:44)
原因:java.lang.ClassCastException:com.sun.proxy.$Proxy32无法强制转换为oracle.jdbc.driver.OracleConnection
位于org.eclipse.persistence.platform.database.oracle.dcn.OracleChangeNotificationListener.register(OracleChangeNotificationListener.java:96)
位于org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.postConnectDatasource(DatabaseSessionImpl.java:847)
位于org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.login(DatabaseSessionImpl.java:756)
位于org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:313)
位于org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:336)
位于org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:302)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)
位于org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.InvokeProxy方法(AbstractEntityManagerFactoryBean.java:388)
位于org.springframework.orm.jpa.AbstractEntityManagerFactoryBean$ManagedEntityManagerFactoryInvocationHandler.invoke(AbstractEntityManagerFactoryBean.java:541)
位于com.sun.proxy.$Proxy13.createEntityManager(未知源)
位于org.springframework.orm.jpa.SharedEntityManagerCreator$SharedentityManagerInvoke.invoke(SharedEntityManagerCreator.java:283)
位于com.sun.proxy.$Proxy19.getDelegate(未知源)
位于com.mysema.query.jpa.impl.JPAProvider.getTemplates(JPAProvider.java:66)
请访问com.mysema.query.jpa.impl.JPAQuery。(JPAQuery.java:44)
Websphere
Caused by: java.lang.ClassCastException: com.ibm.ws.rsadapter.jdbc.WSJdbcConnection incompatible with oracle.jdbc.driver.OracleConnection
at org.eclipse.persistence.platform.database.oracle.dcn.OracleChangeNotificationListener.register(OracleChangeNotificationListener.java:96)
at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.postConnectDatasource(DatabaseSessionImpl.java:847)
at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.login(DatabaseSessionImpl.java:756)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:313)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:336)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:302)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:611)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.invokeProxyMethod(AbstractEntityManagerFactoryBean.java:388)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean$ManagedEntityManagerFactoryInvocationHandler.invoke(AbstractEntityManagerFactoryBean.java:541)
at com.sun.proxy.$Proxy214.createEntityManager(Unknown Source)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:283)
at com.sun.proxy.$Proxy215.getDelegate(Unknown Source)
at com.mysema.query.jpa.impl.JPAProvider.getTemplates(JPAProvider.java:66)
at com.mysema.query.jpa.impl.JPAQuery.<init>(JPAQuery.java:44)
原因:java.lang.ClassCastException:com.ibm.ws.rsadapter.jdbc.wsjdbc连接与oracle.jdbc.driver.OracleConnection不兼容
位于org.eclipse.persistence.platform.database.oracle.dcn.OracleChangeNotificationListener.register(OracleChangeNotificationListener.java:96)
位于org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.postConnectDatasource(DatabaseSessionImpl.java:847)
位于org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.login(DatabaseSessionImpl.java:756)
位于org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:313)
位于org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:336)
位于org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:302)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)中
位于java.lang.reflect.Method.invoke(Method.java:611)
位于org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.InvokeProxy方法(AbstractEntityManagerFactoryBean.java:388)
位于org.springframework.orm.jpa.AbstractEntityManagerFactoryBean$ManagedEntityManagerFactoryInvocationHandler.invoke(AbstractEntityManagerFactoryBean.java:541)
位于com.sun.proxy.$Proxy214.createEntityManager(未知源)
位于org.springframework.orm.jpa.SharedEntityManagerCreator$SharedentityManagerInvoke.invoke(SharedEntityManagerCreator.java:283)
位于com.sun.proxy.$Proxy215.getDelegate(未知源)
位于com.mysema.query.jpa.impl.JPAProvider.getTemplates(JPAProvider.java:66)
请访问com.mysema.query.jpa.impl.JPAQuery。(JPAQuery.java:44)
打开连接似乎有效
Connection unwrapConnection = databaseSession.getServerPlatform()
.unwrapConnection(accessor.getConnection());
oracle.jdbc.OracleConnection connection = null;
try {
if (unwrapConnection.isWrapperFor(OracleConnection.class)) {
connection = unwrapConnection.unwrap(OracleConnection.class);
} else {
// recover, not an oracle connection
connection = (oracle.jdbc.OracleConnection) databaseSession.getServerPlatform()
.unwrapConnection(accessor.getConnection());
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Caused by: java.lang.ClassCastException: com.ibm.ws.rsadapter.jdbc.WSJdbcConnection incompatible with oracle.jdbc.driver.OracleConnection
at org.eclipse.persistence.platform.database.oracle.dcn.OracleChangeNotificationListener.register(OracleChangeNotificationListener.java:96)
at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.postConnectDatasource(DatabaseSessionImpl.java:847)
at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.login(DatabaseSessionImpl.java:756)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:313)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:336)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:302)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:611)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.invokeProxyMethod(AbstractEntityManagerFactoryBean.java:388)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean$ManagedEntityManagerFactoryInvocationHandler.invoke(AbstractEntityManagerFactoryBean.java:541)
at com.sun.proxy.$Proxy214.createEntityManager(Unknown Source)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:283)
at com.sun.proxy.$Proxy215.getDelegate(Unknown Source)
at com.mysema.query.jpa.impl.JPAProvider.getTemplates(JPAProvider.java:66)
at com.mysema.query.jpa.impl.JPAQuery.<init>(JPAQuery.java:44)
Connection unwrapConnection = databaseSession.getServerPlatform()
.unwrapConnection(accessor.getConnection());
oracle.jdbc.OracleConnection connection = null;
try {
if (unwrapConnection.isWrapperFor(OracleConnection.class)) {
connection = unwrapConnection.unwrap(OracleConnection.class);
} else {
// recover, not an oracle connection
connection = (oracle.jdbc.OracleConnection) databaseSession.getServerPlatform()
.unwrapConnection(accessor.getConnection());
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}