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

我使用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 resolution

java.lang.ClassCastException: oracle.jdbc.pool.OracleDataSource cannot be cast to java.sql.Driver

在这一行: cnn = custDataSource.getConnection();


怎么了?为什么我收到这个错误?


鸿蒙传说
浏览 414回答 3
3回答

慕娘9325324

实际上,由于您使用的是连接池,因此CallableStatement实现不是来自驱动程序,而是来自该连接池。要么你应该找到一种方法来访问核心实现(我认为这是有风险的),或者你应该尝试使用CallableStatement唯一的,而不是依赖于 Oracle 实现。

万千封印

尝试更换线路&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stm&nbsp;=&nbsp;(OracleCallableStatement)&nbsp;cnn.prepareCall(sql);和&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stm&nbsp;=&nbsp;cnn.prepareCall(sql).unwrap(OracleCallableStatement.class);

潇湘沐

使用CallableStatement的,而不是用于执行 SQL 存储过程的接口。JDBC API 提供了存储过程 SQL 转义语法,允许以标准方式为所有 RDBMS 调用存储过程。这由prepareCall方法使用创建一个 CallableStatement 对象
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java