为了账号安全,请及时绑定邮箱和手机立即绑定

带有 Oracle com.zaxxer.hikari.pool.HikariProxy

带有 Oracle com.zaxxer.hikari.pool.HikariProxy

鸿蒙传说 2021-08-25 10:02:05
我使用Hikari Pool和OracleCallableStatement:我的数据源:<bean id="myDataSource" class="com.zaxxer.hikari.HikariDataSource">      <property name="jdbcUrl" value="${my.oracle.url}"/>      <property name="driverClassName" value="oracle.jdbc.pool.OracleDataSource"/>      <property name="username" value="${my.oracle.user}"/>      <property name="password" value="${my.oracle.password}"/></bean>我尝试向Oracle以下请求发出请求: public List getProducts(int numbersMonths, Long initServiceId,List<Long> serviceIds) throws SQLException {        Connection cnn = null;        OracleCallableStatement stm = null;        ResultSet rs = null;        List<ProductLink> res = new ArrayList<>();        final String sql = sqlCust(sqlProducts);        try {            cnn = custDataSource.getConnection();            stm = (OracleCallableStatement) cnn.prepareCall(sql);            stm.setPlsqlIndexTable(1, serviceIds.toArray(), serviceIds.size(), serviceIds.size(), OracleTypes.BIGINT, 0);            stm.registerOutParameter(2, OracleTypes.CURSOR);            stm.setLong(3, initServiceId);            stm.setInt(4, numbersMonths);            stm.execute();            rs = stm.getCursor(2);            // do stuff} catch (SQLException ex) {            DbUtils.closeQuietly(cnn, stm, rs);            throw ex;        } finally {            DbUtils.closeQuietly(cnn, stm, rs);        }但我在这一行有错误: stm = (OracleCallableStatement) cnn.prepareCall(sql);java.lang.ClassCastException: com.zaxxer.hikari.pool.HikariProxyCallableStatement cannot be cast to oracle.jdbc.OracleCallableStatement我还有一个错误:Failed to create instance of driver class oracle.jdbc.pool.OracleDataSource, trying jdbcUrl resolutionjava.lang.ClassCastException: oracle.jdbc.pool.OracleDataSource cannot be cast to java.sql.Driver在这一行: cnn = custDataSource.getConnection();怎么了?为什么我收到这个错误?
查看完整描述

3 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

实际上,由于您使用的是连接池,因此CallableStatement实现不是来自驱动程序,而是来自该连接池。

要么你应该找到一种方法来访问核心实现(我认为这是有风险的),或者你应该尝试使用CallableStatement唯一的,而不是依赖于 Oracle 实现。


查看完整回答
反对 回复 2021-08-25
?
万千封印

TA贡献1891条经验 获得超3个赞

尝试更换线路

            stm = (OracleCallableStatement) cnn.prepareCall(sql);

            stm = cnn.prepareCall(sql).unwrap(OracleCallableStatement.class);


查看完整回答
反对 回复 2021-08-25
?
潇湘沐

TA贡献1816条经验 获得超6个赞

使用CallableStatement的,而不是

用于执行 SQL 存储过程的接口。JDBC API 提供了存储过程 SQL 转义语法,允许以标准方式为所有 RDBMS 调用存储过程。

这由prepareCall方法使用

创建一个 CallableStatement 对象


查看完整回答
反对 回复 2021-08-25
  • 3 回答
  • 0 关注
  • 413 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信