我遇到了一个加重问题,这是事实 -
我正在注册一个特定的返回参数,为此我将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()我可以告诉他们它们都是相同的类型......请帮忙!
答案 0 :(得分:8)
如果演员表跨越了类加载器边界,则可能会出现ClassCastException
。例如,如果返回的语句对象的类由类加载器加载,该类加载器与在代码中加载OraclePreparedStatemen
的类加载器不同。这可能是因为在两个地方有两个独立的JDBC jar副本,其中一个由Java EE容器(Tomcat?WAS?)使用,另一个由您的代码使用。