我使用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 实现。
万千封印
TA贡献1891条经验 获得超3个赞
尝试更换线路
stm = (OracleCallableStatement) cnn.prepareCall(sql);
和
stm = cnn.prepareCall(sql).unwrap(OracleCallableStatement.class);
潇湘沐
TA贡献1816条经验 获得超6个赞
使用CallableStatement的,而不是
用于执行 SQL 存储过程的接口。JDBC API 提供了存储过程 SQL 转义语法,允许以标准方式为所有 RDBMS 调用存储过程。
这由prepareCall方法使用
创建一个 CallableStatement 对象
添加回答
举报
0/150
提交
取消