ClassCastException - oracle.jdbc.OraclePreparedStatement

Joh*_*ler 5 java oracle jdbc prepared-statement

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

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

((OraclePreparedStatement) getStatement())
    .registerReturnParameter(index, sqlType);   
Run Code Online (Sandbox Code Playgroud)

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

oracle.jdbc.driver.OraclePreparedStatementWrapper cannot be cast
 to oracle.jdbc.OraclePreparedStatement
Run Code Online (Sandbox Code Playgroud)

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

//class oracle.jdbc.driver.OraclePreparedStatementWrapper
getStatement().getClass();
Run Code Online (Sandbox Code Playgroud)

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" />
Run Code Online (Sandbox Code Playgroud)

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

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

Jim*_*son 9

ClassCastException如果强制转换跨越类加载器边界,则可能发生A. 例如,如果返回的语句对象的类由不同于OraclePreparedStatemen代码中加载的类加载器加载.这可能是因为在两个地方有两个独立的JDBC jar副本,其中一个由Java EE容器(Tomcat?WAS?)使用,另一个由您的代码使用.

  • @John Strickler:我建议只在一个地方安装驱动程序,`tomcat/lib`.我知道这不容易解决 - 享受IT运营+团队的乐趣:-) (3认同)
  • +1类加载器的问题非常微妙和棘手。 (2认同)