Каков подход Spring 5 JDBC, когда нужен nativeJdbcExtractor? - PullRequest
0 голосов
/ 11 мая 2018

Я только что обновил зависимости Spring / SpringBoot и заметил, что у класса JdbcTemplate больше нет свойства "nativeJdbcExtractor".

Мне удалось найти детали и справочную информацию: https://jira.spring.io/browse/SPR-14670

Однако я не смог найти замену конфигурации. Я использую библиотеку commons-dbcp и классы Spring, такие как SimpleJdbcCall и т. Д. Я никогда не имею дело с низкоуровневым API JDBC, однако, если код поставщика требует своего реального Тип соединения (Oracle), настройки nativeJdbcExtractor гарантированно получит его где-то глубоко в коде Spring JDBC (не в моем коде приложения). Я не уверен, как мне решить эту проблему, вызвав connection.unwrap () , если мне нужно, чтобы Spring API обрабатывал это автоматически, как это делалось в прошлом.

java.lang.ClassCastException: org.apache.commons.dbcp2.PoolingDataSource $ PoolGuardConnectionWrapper нельзя привести к oracle.jdbc.OracleConnection

Это скрыто где-то в конфигурации источника данных? Я обновился с commons-dbcp 1.4 до commons-dbcp2, но пока не могу найти ничего полезного (BasicDataSource).

Обновление: Следующий поток актуален, но я не могу переварить искомый ответ, так как объект Connection получен в классе JdbcTemplate и, таким образом, вне моего контроля.

замена для jdbc.support.nativejdbc удалить весной 5

Обновление № 2 - трассировка стека

Caused by: java.lang.ClassCastException: org.apache.commons.dbcp2.PoolingDataSource$PoolGuardConnectionWrapper cannot be cast to oracle.jdbc.OracleConnection
at oracle.sql.TypeDescriptor.setPhysicalConnectionOf(TypeDescriptor.java:832)
at oracle.sql.TypeDescriptor.<init>(TypeDescriptor.java:586)
at oracle.sql.ArrayDescriptor.<init>(ArrayDescriptor.java:224)
at org.springframework.data.jdbc.support.oracle.SqlArrayValue.createTypeValue(SqlArrayValue.java:90)
at org.springframework.jdbc.core.support.AbstractSqlTypeValue.setTypeValue(AbstractSqlTypeValue.java:60)
at org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:293)
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:232)
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:147)
at org.springframework.jdbc.core.CallableStatementCreatorFactory$CallableStatementCreatorImpl.createCallableStatement(CallableStatementCreatorFactory.java:200)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1048)
at org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1104)
at org.springframework.jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:414)
at org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:397)
at org.springframework.jdbc.core.simple.SimpleJdbcCall.execute(SimpleJdbcCall.java:193)

Обновление № 3 - код, выполняющий приведение (Oracle JDBC)

    public void setPhysicalConnectionOf(Connection var1) {
    this.connection = ((oracle.jdbc.OracleConnection)var1).physicalConnectionWithin();
}

1 Ответ

0 голосов
/ 14 мая 2018

Новое:

Похоже, вы используете org.springframework.data.jdbc.support.oracle.SqlArrayValue из spring-data-jdbc-ext.Ошибка есть, и там должно произойти развертывание.

Что-то вроде следующего (не проверено)

protected Object createTypeValue(Connection conn, int sqlType, String typeName)
        throws SQLException { 
    return conn.unwrap(OracleConnection.class).createArray(typeName, values);
}

Относительно драйвера JDBC:

Вы используете Java 8 илипозже, поскольку Spring 5 требует Java 8. Поэтому вы должны использовать ojdbc8 (8 означает Java 8).Я настоятельно рекомендую использовать последнюю версию драйвера 12.2.0.1 из http://www.oracle.com/technetwork/database/application-development/jdbc/downloads/index.html.

Если вы проверите матрицу взаимодействия драйверов из http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-faq-090281.html#01_02, вы увидите, что этот дайвер также работает со старыми базами данных.

Старый / устаревший:

В вашем коде, который выполняет приведение вместо вызова приведения #unwrap.Так что вместо

OracleConnection oracleConnection = (OracleConnection) connection;

call

OracleConnection oracleConnection = connection.unwrap(OracleConnection.class);

В трассировке стека вы видите, кто выполняет приведение, это будет в вашем коде, потому что SimpleJdbcCall и друзья не учитываютдо OracleConnection.Проблема не в JdbcTemplate, а в коде, выполняющем приведение.

...