Вы не можете динамически изменить batch_size
, просто используя EntityManager
AP Ioption во время выполнения, но вы можете иметь некоторый вид управления:
1) Установите для batch_size максимальное ожидаемое значение (500 т. Е.)
2) Установите эти реквизиты, чтобы Hibernate не пытался использовать ранее выполненные операторы save/update
.
hibernate.order_inserts=true
hibernate.order_updatest=true
3) Используйте save
вместо saveAll
. Проходите по списку и очищайте каждый раз, относящийся к сохраняемому классу:
int = flushAfterThisNumber = 10;
for ( int i=0; i<entities.length; i++ ) {
session.save(entities[i]);
if ( i % flushAfterThisNumber == 0 ) {
//flush a batch of inserts and release memory:
session.flush();
session.clear();
}
}
UPDATE
Возможен обходной путь, но вам нужно создать пользовательский репозиторий, чтобы вы могли внедрить EntityManager
, затем развернуть Hibernate Session
и получить доступ к динамическим настройкам batch_size
.
public class CustomerRepositoryImpl implements CustomCustomerRepository {
@PersistenceContext
private EntityManager em;
@Override
public void saveAllInBatch(List<Ent> entities, int batchSize) {
Session session = em.unwrap(Session.class);
session.setJdbcBatchSize(batchSize);
em.saveAll(entities);
}
}