在使用org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnec



conn= Ds.getConnection(); Connection oraconn = ((DelegatingConnection)conn).getInnermostDelegate();

它给出以下例外java.lang.ClassCastException: org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper cannot be cast to org.apache.commons.dbcp.DelegatingConnection

我还设置了资源参数accessToUnderlyingConnectionAllowed=true需要展开此对象才能传递给ArrayDescriptor在tomcat的server.xml中请提前帮助thanx

您的org.apache.commons.dbcp.DegatingConnection可能与连接中的org.apache.com/mons.dbcb.DegatingConnect是不同的类(不同的类加载器)。

如果您通过绑定到容器的warfile提供此类,并且连接是通过tomcat(或其他应用程序服务器)实例化的,则可能会出现这种情况。

要测试这一点,你可以使用类似的东西:

Class.forName("org.apache.commons.dbcp.DelegatingConnection").getClassLoader().toString()
conn.getClassLoader().toString();

你也许可以使用反射。这来自一个类似的问题:

// 'source' is from another classloader
Method method = conn.getClass().getMethod("getInnermostDelegate", new Class[] {});
Object o = method.invoke(conn, new Object[] {});

然而,我不确定return参数是否可以轻易地传递到当前类加载器中的类。如果您遵循反射方法,请确保将所有这些封装在一个类中,不要让method和Object之类的东西从中溢出。我不建议这样做,但它应该有效。

另一种选择是将代码放在与连接相同的位置。(tomcat lib)

当然,首先要检查您是否确实为代码使用了两个不同的类加载器D

编辑:

从评论来看,这里似乎有两个类加载器在工作。我忘了提第三种方法。

  1. preferred:从war文件中删除提供DelegatingConnection的jar文件,并依靠common/lib类加载器提供它
  2. 通过在common/lib类加载器中放置war来运行代码
  3. reflect:可能不好,可能会在将结果对象强制转换到正确的类时出现问题