0

我有一个关于投射CallableStatement到的问题OracleCallableStatement。它给出了ClassCastException这样的:

java.lang.ClassCastException:
    oracle.jdbc.driver.OracleCallableStatementWrapper cannot be cast to
    oracle.jdbc.driver.OracleCallableStatement

代码是:

Connection conn = qdbDataSource.getConnection();
PreparedStatement pstmt = null;
Connection conn2 = ((WLConnection)conn).getVendorConnection();
try {
    CallableStatement cs = conn2.prepareCall("{ ?=call asr.bsc(?,?,?,?,?,?,?)}");
    OracleCallableStatement ocs = (OracleCallableStatement)cs;
// (...)
}

我尝试使用 spring jdbc 模板,但结果是一样的。

我使用的是 WebLogic 10.3.2,数据源的驱动程序类是默认的。我也在ojdbc14.jar我的项目中使用,启动类路径不包括它。

有任何想法吗?

编辑:这些是运行时包装类的子类:

weblogic.jdbc.wrapper.CallableStatement_oracle_jdbc_driver_OracleCallableStatementWrapper class
weblogic.jdbc.wrapper.CallableStatement class
weblogic.jdbc.wrapper.PreparedStatement class
weblogic.jdbc.wrapper.Statement class
weblogic.jdbc.wrapper.JDBCWrapperImpl class
weblogic.utils.wrapper.WrapperImpl class java.lang.Object
4

4 回答 4

2

将 getVendorConnection() 的结果转换为 OracleConnection,而不是使用 OracleCallableStatement 而不是 CallableStatement,

oracle.jdbc.OracleConnection conn2 = (oracle.jdbc.OracleConnection)(((WLConnection)conn).getVendorConnection());
于 2012-06-19T07:30:45.673 回答
2

java.lang.ClassCastException:oracle.jdbc.driver.OracleCallableStatementWrapper 无法强制转换为 oracle.jdbc.driver.OracleCallableStatement

所以我几周前工作OracleCallableStatement,我用 import 解决了它ojdbc6.jar

所以你只需将这个文件添加到你的项目中,它就会直接提供OracleCallableStatement等等

OraclePreparedStatement

您所需要的就是import oracle.jdbc.OracleCallableStatement;它,它会起作用。

Connection con = null;
OracleCallableStatement cs = null;
try {
   con = OracleDAOFactory.getOracleDatabaseConnection();
   cs = (OracleCallableStatement) con.prepareCall(SOME_PROCEDURE);
   ...
}

看看这个

于 2012-06-20T08:32:08.543 回答
0

我找到了。它是我的 lib 文件夹下的 ojdbc jar。我在 weblogic.xml 中使用如下语句:

首选 webinf 类

这首先提供了使用 web-inf/lib 下的 jar 文件。因此,当它在该文件夹下找到一个 ojdbc.jar 时,它只适合我的应用程序,但不适用于 weblogic 本身。因为 weblogic 在它下面有它自己的 ojdbc jar 并且不知何故,它只是扩展了 OracleCallableStatement 类以从它自己的 ojdbc jar 中包装它们。因为我有一个单独的 ojdbc jar,所以在运行时,它无法将其转换为我的 jar 的 OracleCallableStatement。当我删除 web-inf/lib 下的 jar 并将 jdbc 连接和语句部分的责任交给 weblogic 时,它起作用了。

谢谢各位

于 2012-06-20T13:23:30.157 回答
-1

我会给出最好的解决方案,一种方法是<wls:prefer-web-inf-classes>false</ wls:prefer-web-inf-classes >weblogic.xml中使用。如果你想要 true 而不是falseinweb-inf-classes那么另一种方法是删除lib 文件夹中的ojdbcXX.jar。在编译程序时,您可以在类路径中使用任何ojdbcXX.jar。但是在部署时从 lib中删除ojdbcXX.jar 。这样 weblogic 应用服务器就会使用自己的 ojdbc 并且它会成功运行而不会出现任何错误。

于 2015-06-04T05:47:23.863 回答