Как сделать массовые вставки с JpaRepository с динамическим batch_size, т.е. batch_size не известно - PullRequest
1 голос
/ 11 апреля 2019

Я работаю в API загрузки Java, где мне нужно вставить массив данных в мою базу данных. Я знаю, как мне этого добиться.

Чтобы получить массовую вставку с помощью Sring Boot и Spring Data JPA, вам понадобятся только две вещи:

  • установить опцию spring.jpa.properties.hibernate.jdbc.batch_size = 50
  • используйте saveAll() метод вашего репо со списком сущностей, подготовленных для вставки.

Что я хочу знать, так это то, что как я могу добиться динамического batch_size, т.е. в некоторых классах мне нужно сохранять / вставлять только 5-10 записей, в то время как в некоторых классах это число может составлять от 200 до 500 или более записей.

Теперь, Как мне добиться этой динамической опции batch_size .

1 Ответ

1 голос
/ 11 апреля 2019

Вы не можете динамически изменить 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...