Oracle11g SpringJDBC:使用Oracle时出错

Oracle11g SpringJDBC:使用Oracle时出错,oracle11g,spring-jdbc,Oracle11g,Spring Jdbc,我们有一个Spring应用程序,它使用NamedParameterJdbcTemplate将消息持久化到Oracle数据库。sql是一个简单的插入。insert可以工作,数据库也会更新,但无论如何会引发以下异常 04:02:58.276 [org.springframework.jms.listener.DefaultMessageListenerContainer#0-1] DEBUG o.s.jdbc.core.StatementCreatorUtils - JDBC 3.0 getPara

我们有一个Spring应用程序,它使用NamedParameterJdbcTemplate将消息持久化到Oracle数据库。sql是一个简单的插入。insert可以工作,数据库也会更新,但无论如何会引发以下异常

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]

我想知道是否有人可以帮助识别这个问题,谢谢。

检查代码中使用的部分
PreparedStatementMetaData

preparedStatement.getParameterMetaData().getParameterType(索引)
这将导致这个例外


或者,您必须共享您的代码。

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

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

我还没有解决办法。。。

编辑:使用oracle驱动程序ojdbc7.jar时,将实现parameterMetaData.getParameterType

编辑2:让我们投票赞成改进;-)


更新:在3.2.6、4.0 GA(SPR-11100)中修复了此问题。

您将不得不共享代码,只是错误不会有帮助。