【问题标题】:Spring JDBC: error while using OracleSpring JDBC:使用 Oracle 时出错
【发布时间】:2013-10-12 23:28:51
【问题描述】:

我们有一个 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]

我想知道是否有人可以帮助确定问题,谢谢。

【问题讨论】:

  • 您将不得不分享代码,只是错误无济于事。

标签: oracle11g spring-jdbc


【解决方案1】:

当您在列中设置 null 时,setNull 函数需要数据库 ParameterType。 oracle 驱动不支持功能 ps.getParameterMetaData().getParameterType(paramIndex) 并且抛出异常,并且日志中的调试消息:“JDBC 3.0 getParameterType call not supported” 然后使用回退方法。

这个 spring-jdbc 实现的一个问题(旧版本没有这样做)是捕获异常非常慢,并且对于您设置一个空值的每一列,都会抛出并捕获这个异常。结果是从毫秒到 100 毫秒的查询...

我还没有解决办法... https://jira.springsource.org/browse/SPR-10385

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

编辑:当你使用 oracle 驱动程序 ojdbc7.jar 然后实现 parameterMetaData.getParameterType

Edit2:让我们为改进投票吧 ;-) https://jira.springsource.org/browse/SPR-11100

更新:已在 3.2.6、4.0 GA (SPR-11100) 中修复

【讨论】:

    【解决方案2】:

    检查您在代码中使用PreparedStatementMetaData 的某些位置

    preparedStatement.getParameterMetaData().getParameterType(index); 这将导致此异常。

    否则您将不得不分享您的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      • 2019-11-11
      • 2012-09-05
      相关资源
      最近更新 更多