繁体   English   中英

HikariCP与Oracle com.zaxxer.hikari.pool.HikariProxyCallableStatement无法强制转换为oracle.jdbc.OracleCallableStatement

[英]HikariCP with Oracle com.zaxxer.hikari.pool.HikariProxyCallableStatement cannot be cast to oracle.jdbc.OracleCallableStatement

我使用Hikari PoolOracleCallableStatement

我的数据源:

<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();

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

请改用CallableStatement

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

这由prepareCall方法使用

创建CallableStatement对象

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

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

尝试更换线路

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM