я обнаружил, что JPA не поддерживает следующие обновления:JPA - Batch/Bulk Update - Какой лучший подход?
Update Person p set p.name = :name_1 where p.id = :id_1,
p.name = :name_2 where p.id = :id_2,
p.name = :name_3 where p.id = :id_3
....
// It could go on, depending on the size of the input. Could be in 100s
Поэтому у меня есть два варианта:
Вариант 1:
Query q = em.createQuery("Update Person p set p.name = :name where p.id = :id");
For (int x=0; PersonsList.length; x++) {
// add name and id parameters
em.executeUpdate();
}
Вопросы:
- Это все, что необходимо для пакетного обновления? Что-нибудь еще мне нужно добавить? Я установил
hibernate.jdbc.batch_size", "20"
- Включена ли оптимистичная блокировка здесь по умолчанию? (У меня нет @Version в моей сущности)
- Что мне нужно сделать, чтобы обеспечить оптимистическое блокирование, если не @Version?
Вариант 2:
Построить один единственный запрос с использованием либо Select Case
синтаксиса или с Criteria API
Вопросы:
- Имеет ли пакетирование все еще случаются здесь? (В одном большом запросе)
- Это лучше, чем первый подход с точки зрения производительности?
- Каков рекомендуемый подход из этих двух вариантов? Любой другой лучший подход?
C'mon вы действительно хотите запустить объем в течение 3 рядов? bulk вызывает блокировку Intent на целевой таблице, и это нехорошо, просто запустите пакет 'em.begin()' и вызовите все DML и, наконец, 'em.commit();' –
Нет. Его динамика. Я просто показал 3 в примере :-). Это может быть 100 секунд. –
Это иждивенцы приятельницы, какая БД вы используете? и как часто вы хотите запускать такие запросы? но если вы спросите меня, я предпочитаю, чтобы DB предпочитал путь и запускал его параллельно с низким приоритетом. –