2

Oracle JDBC 支持两种不同的更新批处理模型:标准批处理和 Oracle 特定批处理。

根据 oracle 11g JDBC Developer Guide,在任何单个应用程序中,您可以使用一种模型或另一种模型,但不能同时使用这两种模型。当你混合这些时,Oracle JDBC 驱动程序会抛出异常

在我的独立应用程序中,上述陈述不成立。我想知道我是否遗漏了什么。

在我的应用程序中,我创建了一个 OracleDataSource 并执行以下操作


    connection = datasource.getConnection();
    preparedStatement = connection.prepareStatement("update CAR set CAR_NAME=?, OBJECT_VERSION=? where CAR_ID=?");
    for(Car car : cars) {
       preparedStatement.setString(1, car.getName());
       preparedStatement.setInt(2, car.getVersion() + 1);
       preparedStatement.setLong(3, car.getId());
       preparedStatement.addBatch();
    }

System.out.println("Update Batch : " + Arrays.toString(preparedStatement.executeBatch())); for(Car car : cars) { car.setName("v car " + car.getId()); } //Oracle Update Batching connection.setAutoCommit(false); PreparedStatement preparedStatement = connection.prepareStatement("update CAR set CAR_NAME=?, OBJECT_VERSION=? where CAR_ID=?"); //Change batch size for this statement to 3 ((OraclePreparedStatement)preparedStatement).setExecuteBatch (10); for(Car car : cars) { preparedStatement.setString(1, car.getName()); preparedStatement.setInt(2, car.getVersion() + 1); preparedStatement.setLong(3, car.getId()); System.out.println("Execute Update Count " + preparedStatement.executeUpdate()); } System.out.println("Update Count : " + ((OraclePreparedStatement)preparedStatement).sendBatch()); // JDBC sends the queued request connection.commit(); preparedStatement.close();

上面的代码运行良好,我可以看到使用不同批处理模型的更新批处理执行良好。有什么我遗漏的或者我对 jdbc 开发人员指南的解释不正确吗?

提前致谢

4

1 回答 1

2

是的,他们写的是事实 :-) 但这适用于 PreparedStatement 的一个实例

我查看了 OraclePreparedStatement 的反编译源:

public void addBatch() throws SQLException {
  synchronized(connection){
    setJdbcBatchStyle();
    processCompletedBindRow(currentRank + 2, currentRank > 0 && sqlKind.isPlsqlOrCall());
    currentRank++;
  }
}

final void setJdbcBatchStyle() throws SQLException {
  if(m_batchStyle == 1){
        SQLException sqlexception =    DatabaseError.createSqlException(getConnectionDuringExceptionHandling(), 90, "operation cannot be mixed with Oracle-style batching");
        sqlexception.fillInStackTrace();
        throw sqlexception;
    } else{
        m_batchStyle = 2;
        return;
    }
}

因此,他们确实检查了 OraclePreparedStatement 实例的批处理模式的混合

于 2012-01-12T10:27:20.880 回答