Модели пакетного обновления Oracle - использование обеих моделей пакетирования в одном приложении - PullRequest
2 голосов
/ 12 февраля 2011

Oracle JDBC поддерживает две разные модели пакетирования обновлений: стандартная пакетная обработка и специфичная для Oracle групповая обработка.

В соответствии с Руководством разработчика JDBC oracle 11g, в любом отдельном приложении вы можете использовать одну или другую модель, , но не обе.Драйвер 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();
    }</p>

<code>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 неверна?

Заранее спасибо

1 Ответ

2 голосов
/ 12 января 2012

Да, они пишут правду :-) Но это применимо к одному экземпляру 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

...