Пакетная оптимизация c запросов на блокировку в EclipseLink - PullRequest
0 голосов
/ 27 февраля 2020

У нас есть кодовая база с сущностями JPA, каждая из которых имеет поле long, помеченное @Version. В ходе транзакции оптимистичные c блокировки захватываются некоторыми объектами с entityManager.lock(entity, LockModeType.OPTIMISTIC), поэтому при фиксации транзакции EclipseLink запускает запросы следующей формы:

UPDATE <table> SET VERSION = <x> where ((ID = <y>) AND (VERSION = <x>));

, где y - это ID объекта и x - номер текущей версии (он не обновляется). Однако по какой-то причине он выполняет каждый запрос по отдельности, например (из журналов MySQL):

UPDATE TableA SET VERSION = 5 WHERE ((ID = 1) AND (VERSION = 5));
UPDATE TableA SET VERSION = 4 WHERE ((ID = 2) AND (VERSION = 4));
UPDATE TableA SET VERSION = 3 WHERE ((ID = 3) AND (VERSION = 3));
UPDATE TableA SET VERSION = 2 WHERE ((ID = 4) AND (VERSION = 2));
UPDATE TableA SET VERSION = 1 WHERE ((ID = 5) AND (VERSION = 1));
-- etc

В то время как мы хотим, чтобы все запросы для одной и той же таблицы были объединены в одну UPDATE.

Есть ли где-нибудь флаг, который нам нужно установить, чтобы включить это? Типичная транзакция может генерировать сотни таких запросов для одной и той же таблицы.

1 Ответ

0 голосов
/ 27 февраля 2020

Пакетная запись настраивается с использованием свойства персистентности "eclipselink.jdb c .batch-writing" . Вы все еще можете не получить это, чтобы изменить операторы блокировки Optimisti c, хотя, поскольку это зависит от вашего драйвера и класса платформы EclipseLink DB: код должен определить, какой оператор потерпел неудачу, если есть проблема, чтобы он мог указать, какой объект был участвует в брошенном OptimisticLockException.

...