Spring: собственный пакетный запрос с использованием аннотации запроса в репозитории? ⇐ JAVA
-
Гость
Spring: собственный пакетный запрос с использованием аннотации запроса в репозитории?
Мне приходится выполнять обновления тысяч записей одновременно, разбитых на пакеты, скажем, по 25 фактических обновлений за раз. Обновление основано на уникальном ограничении «сервис+ключ», и если вставка не удалась, значение обновляется.
Обратите внимание, что меня интересует случай UPSERT, а не только стандартные вставки, поскольку я хочу избежать дополнительных операций чтения базы данных, поскольку эти данные в основном статичны.
Я использую Spring с Postgres 14 и думал, что сделаю что-то вроде следующего, чтобы выполнить обновление в классе репозитория, но хотел убедиться, что обновления выполняются пакетно, если это возможно.
Я установил следующие свойства весенней загрузки, но не вижу никаких сообщений в журнале, указывающих на то, что происходит пакетная обработка:
spring.jpa.properties.hibernate.jdbc.batch_size = 25 Spring.jpa.properties.hibernate.order_inserts = правда Могу ли я сделать это, используя такой метод, или мне нужно сделать это другим способом, например?
@Transactional @Модификация @Запрос( родной запрос = правда, значение = "ВСТАВИТЬ В мою_таблицу" + " (сервис, ключ, значение, версия) " + «ЦЕННОСТИ» + " (:service, :key, :value, :version)" + "В КОНФЛИКТЕ НА ОГРАНИЧЕНИИ позвольте_one_value_per_service_key DO" + «ОБНОВЛЕНИЕ» + "УСТАНОВИТЬ" + "значение = исключенное.значение, версия=моя_таблица.версия + 1" + "ГДЕ" + "my_table.value исключенное.значение") недействительный upsertValue( @Param("service") Строковая служба, @Param("key") Строковый ключ, @Param("значение") Строковое значение, @Param("версия") int версия ); РЕДАКТИРОВАТЬ: Моя цель состоит в том, чтобы вставлять или обновлять БД только в пакетном режиме (одна транзакция в пакете) и ничего не делать, если значение не изменилось. Итак, для нового «сервиса», в который еще не было вставлено ни одного значения, я буду вставлять около 5000 значений одновременно, и я хочу, чтобы это было сделано в группах, чтобы избежать перегрузки Postgres и создания больших журналов транзакций. РЕДАКТИРОВАТЬ 2: Обратите внимание: если вы используете @DataJpaTest для проверки обновления, с базой данных H2 произойдет сбой, поскольку она не поддерживает INSERT ON CONFLICT (unique) UPDATE. Подробности здесь
Мне приходится выполнять обновления тысяч записей одновременно, разбитых на пакеты, скажем, по 25 фактических обновлений за раз. Обновление основано на уникальном ограничении «сервис+ключ», и если вставка не удалась, значение обновляется.
Обратите внимание, что меня интересует случай UPSERT, а не только стандартные вставки, поскольку я хочу избежать дополнительных операций чтения базы данных, поскольку эти данные в основном статичны.
Я использую Spring с Postgres 14 и думал, что сделаю что-то вроде следующего, чтобы выполнить обновление в классе репозитория, но хотел убедиться, что обновления выполняются пакетно, если это возможно.
Я установил следующие свойства весенней загрузки, но не вижу никаких сообщений в журнале, указывающих на то, что происходит пакетная обработка:
spring.jpa.properties.hibernate.jdbc.batch_size = 25 Spring.jpa.properties.hibernate.order_inserts = правда Могу ли я сделать это, используя такой метод, или мне нужно сделать это другим способом, например?
@Transactional @Модификация @Запрос( родной запрос = правда, значение = "ВСТАВИТЬ В мою_таблицу" + " (сервис, ключ, значение, версия) " + «ЦЕННОСТИ» + " (:service, :key, :value, :version)" + "В КОНФЛИКТЕ НА ОГРАНИЧЕНИИ позвольте_one_value_per_service_key DO" + «ОБНОВЛЕНИЕ» + "УСТАНОВИТЬ" + "значение = исключенное.значение, версия=моя_таблица.версия + 1" + "ГДЕ" + "my_table.value исключенное.значение") недействительный upsertValue( @Param("service") Строковая служба, @Param("key") Строковый ключ, @Param("значение") Строковое значение, @Param("версия") int версия ); РЕДАКТИРОВАТЬ: Моя цель состоит в том, чтобы вставлять или обновлять БД только в пакетном режиме (одна транзакция в пакете) и ничего не делать, если значение не изменилось. Итак, для нового «сервиса», в который еще не было вставлено ни одного значения, я буду вставлять около 5000 значений одновременно, и я хочу, чтобы это было сделано в группах, чтобы избежать перегрузки Postgres и создания больших журналов транзакций. РЕДАКТИРОВАТЬ 2: Обратите внимание: если вы используете @DataJpaTest для проверки обновления, с базой данных H2 произойдет сбой, поскольку она не поддерживает INSERT ON CONFLICT (unique) UPDATE. Подробности здесь
Мобильная версия