开发者社区> 问答> 正文

不能转换为OraclePreparedStatement:报错

用C3P0连接池处理Oracle时说NewProxyPreparedStatement不能转换为OraclePreparedStatement:报错

本意是想用一种方法读取新插入Oracle的sequeuce的值,用C3P0作为连接池,方法如下

String sql = "insert into tb_(tb_id , tb_name) values(seq_.nextval,?) returning tb_id into ?";
//在这个地方出错
OraclePreparedStatement ppst = 
(OraclePreparedStatement)this.conn.prepareStatement(sql);

ppst.setString(1, "hehe");
ppst.registerReturnParameter(2, Type.INT);
ppst.executeUpdate();
ResultSet rs = ppst.getReturnResultSet();
rs.next();
id = rs.getInt(1);

异常是:
Caused by: java.lang.ClassCastException: com.mchange.v2.c3p0.impl.NewProxyPreparedStatement cannot be cast to oracle.jdbc.OraclePreparedStatement
说是C3P0的NewProxyPreparedStatemennt不能转换成OraclePreparedStatement,不知道有没有方法可以解决这个问题?google,百度了好久都没有答案,如果不能解决,那还是什么比较好的方法可以取得新插入Oracle的sequeuce的值?我看过有5种方法http://blog.csdn.net/yzsind/article/details/6918506,我用的是第5种,第4种我检验过可以用.
再顺便问一下,用returning into的方法可以取得delete或者是update的sequeuce的值吗?我测试好像是不行的.
谢谢啦~~

展开
收起
kun坤 2020-06-08 19:21:22 988 0
1 条回答
写回答
取消 提交回答
  • 连接池拿出来的对象都是经过包装的,如果需要用原生对象,使用unwrap方法。
    PreparedStatement pstmt = conn.prepareStatement(sql); OraclePreparedStatement oracleStmt = pstmt.unwrap(OraclePreparedStatement.class); ######正解!!非常感谢!###### 这种奇怪问题我之前碰到过,不过是自己写的连接池。
    建议试试升级驱动和连接池看看,另外c3p0没怎么更新了,试试 druid 吧。 ######忘了说了驱动版本是ojdbc6.jar,在oracle官网上下的######

    引用来自“红薯”的答案

    这种奇怪问题我之前碰到过,不过是自己写的连接池。 建议试试升级驱动和连接池看看,另外c3p0没怎么更新了,试试 druid 吧。 @红薯 大哥~~还是不行啊,我下了最新的驱动和连接池也不行,用了druid还是一样在的问题 com.alibaba.druid.pool.DruidPooledPreparedStatement cannot be cast to oracle.jdbc.OraclePreparedStatement 你看看是不是我写的代码出的问题? oracle版本 oracleXE 11.2.0.2 Win32 java版本 JDK 1.7 update10
    2020-06-08 19:21:28
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载