Как массовое обновление в HIbernate

0

Мне нужно обновить несколько строк в моей базе данных MySQL, используя Hibernate. Я сделал это с помощью JDBC, где у нас есть поддержка пакетного запроса. Я хочу что-то подобное в спящем режиме.

Поддерживает ли спящий режим пакетный запрос?

Пример загруженного запроса в jdbc:

      // Create statement object
      Statement stmt = conn.createStatement();

      String SQL = "INSERT INTO Employees (id, first, last, age) " +
         "VALUES(200,'Zia', 'Ali', 30)";

       // Add above SQL statement in the batch.
      stmt.addBatch(SQL);

        // Create one more SQL statement
        String SQL = "INSERT INTO Employees (id, first, last, age) " +
         "VALUES(201,'Raj', 'Kumar', 35)";

      // Add above SQL statement in the batch.
      stmt.addBatch(SQL);

     int[] count = stmt.executeBatch();

Теперь, когда мы высылаем вызов stmt.executeBatch Оба Sql Query будут выполняться в однократной поездке jdbc.

Теги:
hibernate

1 ответ

0

Вы можете проверить документацию Hibernate. Hibernate имеет некоторые свойства конфигурации, которые управляют (или отключают) использование пакетной обработки JDBC.

  • Если вы выдаете один и тот же INSERT несколько раз, и ваша сущность не использует генератор идентификаторов, Hibernate будет использовать пакет JDBC прозрачно.
  • Конфигурация должна позволять использование пакетной обработки JDBC. Пакет отключен по умолчанию.

Настройка спящего режима

Свойство hibernate.jdbc.batch_size определяет количество операторов, которые Hibernate будет выполнять до того, как попросит драйвер выполнить пакет. Ноль или отрицательное число отключит дозатор.

Вы можете определить глобальную конфигурацию, например, в файле persistence.xml или определить конфигурацию, зависящую от сеанса. Чтобы настроить сеанс, вы можете использовать следующий код:

entityManager
    .unwrap( Session.class )
    .setJdbcBatchSize( 10 );

Использование пакетной обработки JDBC

Как упоминалось ранее, Hibernate разрешает пакет JDBC прозрачно. Если вы хотите контролировать дозирование, вы можете использовать методы flush() и clear() в сеансе.

Ниже приведен пример из Документации. Он вызывает flush() и clear() когда количество вставок достигает значения batchSize. Он работает эффективно, если batchSize меньше или равно настроенному hibernate.jdbc.batch_size.

EntityManager entityManager = null;
EntityTransaction txn = null;
try {
    entityManager = entityManagerFactory().createEntityManager();

    txn = entityManager.getTransaction();
    txn.begin();

    // define a batch size lesser or equal than the JDBC batching size    
    int batchSize = 25;

    for ( int i = 0; i < entityCount; ++i ) {
        Person Person = new Person( String.format( "Person %d", i ) );
        entityManager.persist( Person );

        if ( i > 0 && i % batchSize == 0 ) {
            //flush a batch of inserts and release memory
            entityManager.flush();
            entityManager.clear();
        }
    }

    txn.commit();
} catch (RuntimeException e) {
    if ( txn != null && txn.isActive()) txn.rollback();
        throw e;
} finally {
    if (entityManager != null) {
        entityManager.close();
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню