HikariCP с Oracle com.zaxxer.hikari.pool.HikariProxyCallableStatement не может быть приведен к oracle.jdbc.OracleCallableStatement - PullRequest
0 голосов
/ 31 августа 2018

Я использую 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: общедоступный список 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();

Что не так? Почему я получаю эти ошибки?

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

На самом деле, поскольку вы используете пул соединений, реализация CallableStatement не из драйвера, а из этого пула соединений.

Либо вы должны найти способ получить доступ к реализации core (что я считаю рискованным), либо вы должны попытаться использовать только CallableStatement и не зависеть от реализации Oracle.

0 голосов
/ 31 августа 2018

Попробуйте заменить строку

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

с

            stm = cnn.prepareCall(sql).unwrap(OracleCallableStatement.class);
0 голосов
/ 31 августа 2018

Используйте CallableStatement вместо

Интерфейс, используемый для выполнения хранимых процедур SQL. API JDBC предоставляет синтаксис escape SQL хранимых процедур, который позволяет стандартным образом вызывать хранимые процедуры для всех СУБД.

Используется prepareCall метод

Создает объект CallableStatement

...