1

我尝试使用以下代码添加批处理准备语句:

Connection c = ...
PreparedStatement ps = c.prepareStatement(query1);
ps.setObject(....)
...
ps.addBatch(query2); // SqlException : Unsupported feature

oracle jdbc驱动不支持批处理,还是我做错了什么?

我正在使用 oracle 瘦驱动程序。来自 MANIFEST.MF 的版本Implementation-Version: 11.2.0.1.0

java.sql.SQLException: Unsupported feature
        at oracle.jdbc.driver.OraclePreparedStatement.addBatch(OraclePreparedStatement.java:9803)
        at oracle.jdbc.driver.OracleStatementWrapper.addBatch(OracleStatementWrapper.java:285)
        at org.jboss.resource.adapter.jdbc.WrappedStatement.addBatch(WrappedStatement.java:731)
        at <application classes>
4

2 回答 2

6

您正在创建一个PreparedStatement使用query1并添加query2到它不属于的已经准备好的语句。

如果您正在使用PreparedStatement,我建议改用该PreparedStatement.addBatch()方法。

PreparedStatement ps = c.prepareStatement(query1);
ps.setObject(....);
ps.addBatch(); //Voila
于 2013-07-12T09:09:16.303 回答
3

如果您调用任何接受查询字符串的 、 或 方法,JDBC规范明确要求PreparedStatement(和CallableStatement)实现抛出一个。SQLExceptionexecuteexecuteUpdateexecuteQueryaddBatch

例如,参见 Javadoc Statement.addBatch(String sql)

抛出:
SQLException - 如果发生数据库访问错误,则在关闭时调用此方法Statement,驱动程序不支持批量更新,在上调用该方法PreparedStatementCallableStatement

(强调我的)

PreparedStatement您只能使用这些方法setXXX,然后使用addBatch()为准备好的查询批处理参数值集(并为不同的参数值集重复该操作)。您不能像使用普通Statement.

使用批处理的方式PreparedStatement大致是这样的:

try (PreparedStatement ps = c.prepareStatement(query1)) {
    while (moreParameterValueSets) {
        ps.setObject(....)
        //...
        ps.addBatch();
    }
    ps.executeBatch();
}
于 2013-07-12T09:17:56.387 回答