ClassCastException - oracle.jdbc.OraclePreparedStatement

时间:2011-08-04 13:59:15

标签: java oracle jdbc prepared-statement

我遇到了一个加重问题,这是事实 -

我正在注册一个特定的返回参数,为此我将java.sql.PreparedStatement转换为oracle.jdbc.OraclePreparedStatement。

((OraclePreparedStatement) getStatement())
    .registerReturnParameter(index, sqlType);   

当我从Eclipse运行它时它非常有效,它甚至可以在我们的开发服务器上按预期运行。但是,当我将它移动到我的测试服务器时,我遇到了意外错误......

oracle.jdbc.driver.OraclePreparedStatementWrapper cannot be cast
 to oracle.jdbc.OraclePreparedStatement

这对我来说是一个非常奇怪的错误,因为我确信可以从getStatement()分配OraclePreparedStatement。我已经调试过,发现所有环境都是正确的:

//class oracle.jdbc.driver.OraclePreparedStatementWrapper
getStatement().getClass();

LOCAL和DEV环境都使用我在META-INF / context.xml中设置的DataSource:

<Resource name="dataSource/dbsubm" auth="Container"
    type="oracle.jdbc.xa.client.OracleXADataSource"
    factory="org.apache.naming.factory.BeanFactory"
    user="*****" password="******"
    URL="jdbc:oracle:thin:@host:port:db" />

TEST环境不同,因为它有一个来自server.xml的DataSource,即使配置完全相同。这对我来说是这些环境之间的唯一区别。

可能是什么问题?为什么我使用相同的代码但不同的环境获得ClassCastException?使用getClass()我可以告诉他们它们都是相同的类型......请帮忙!

1 个答案:

答案 0 :(得分:8)

如果演员表跨越了类加载器边界,则可能会出现ClassCastException。例如,如果返回的语句对象的类由类加载器加载,该类加载器与在代码中加载OraclePreparedStatemen的类加载器不同。这可能是因为在两个地方有两个独立的JDBC jar副本,其中一个由Java EE容器(Tomcat?WAS?)使用,另一个由您的代码使用。