Мне нужно обновить несколько строк в моей базе данных 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. Hibernate имеет некоторые свойства конфигурации, которые управляют (или отключают) использование пакетной обработки JDBC.
INSERT
несколько раз, и ваша сущность не использует генератор идентификаторов, Hibernate будет использовать пакет 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();
}
}