Java 使用EclipseLink DCN会导致OracleChangeNotificationListener.register中出现ClassCastException

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

首先,我在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()
                    .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();
        }