Spring JDBC: ошибка при использовании Oracle

У нас есть приложение Spring, которое использует NamedParameterJdbcTemplate для сохранения сообщений в базе данных Oracle. SQL - это простая вставка. Вставка работает, и база данных обновляется, но, тем не менее, возникает следующее исключение.

04:02:58.276 [org.springframework.jms.listener.DefaultMessageListenerContainer#0-1] DEBUG o.s.jdbc.core.StatementCreatorUtils - JDBC 3.0 getParameterType call not supported
java.sql.SQLException: Unsupported feature
    at oracle.jdbc.driver.OracleParameterMetaData.getParameterType(OracleParameterMetaData.java:166) ~[ojdbc6-11.2.0.2.0.jar:11.2.0.2.0]
    at org.springframework.jdbc.core.StatementCreatorUtils.setNull(StatementCreatorUtils.java:231) [spring-jdbc-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:213) [spring-jdbc-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:144) [spring-jdbc-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.springframework.jdbc.core.BatchUpdateUtils.setStatementParameters(BatchUpdateUtils.java:63) [spring-jdbc-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.springframework.jdbc.core.namedparam.NamedParameterBatchUpdateUtils.access$000(NamedParameterBatchUpdateUtils.java:32) [spring-jdbc-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.springframework.jdbc.core.namedparam.NamedParameterBatchUpdateUtils$1.setValues(NamedParameterBatchUpdateUtils.java:47) [spring-jdbc-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:899) [spring-jdbc-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:890) [spring-jdbc-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:589) [spring-jdbc-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:617) [spring-jdbc-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.springframework.jdbc.core.JdbcTemplate.batchUpdate(JdbcTemplate.java:890) [spring-jdbc-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.springframework.jdbc.core.namedparam.NamedParameterBatchUpdateUtils.executeBatchUpdateWithNamedParameters(NamedParameterBatchUpdateUtils.java:40) [spring-jdbc-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.batchUpdate(NamedParameterJdbcTemplate.java:324) [spring-jdbc-3.2.4.RELEASE.jar:3.2.4.RELEASE]
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.batchUpdate(NamedParameterJdbcTemplate.java:319) [spring-jdbc-3.2.4.RELEASE.jar:3.2.4.RELEASE]

Интересно, может ли кто-нибудь помочь в определении проблемы, спасибо.


person user1052610    schedule 06.10.2013    source источник
comment
Вам придется поделиться кодом, просто ошибка не поможет.   -  person Lokesh    schedule 06.10.2013


Ответы (2)


Когда вы устанавливаете null в столбце, функции setNull требуется ParameterType базы данных. Драйвер оракула не поддерживает функцию ps.getParameterMetaData().getParameterType(paramIndex), возникает исключение и отладочное сообщение в журнале: «Вызов JDBC 3.0 getParameterType не поддерживается». Затем используется резервный метод.

Одна проблема с этой реализацией spring-jdbc (более старые версии этого не делали) заключается в том, что исключение catch очень медленное, и для каждого столбца, в котором вы устанавливаете нулевое значение, это исключение выдается и перехватывается. Результатом является запрос от миллисекунд до сотен миллисекунд...

У меня пока нет решения... https://jira.springsource.org/browse/SPR-10385

https://forums.oracle.com/thread/587880

Изменить: когда вы используете драйвер оракула ojdbc7.jar, тогда реализуется параметрMetaData.getParameterType

Edit2: Давайте проголосуем за улучшение ;-) https://jira.springsource.org/browse/SPR-11100

Обновление: исправлено в 3.2.6, 4.0 GA (SPR-11100)

person m.breevoort    schedule 07.11.2013

Убедитесь, что где-то в вашем коде вы используете PreparedStatementMetaData

preparedStatement.getParameterMetaData().getParameterType(index); что приведет к этому исключению.

Или вам придется поделиться своим кодом.

person Samy    schedule 09.10.2013