2 модуля пытаются записать одно и то же значение в один и тот же момент в БД, создавая уникальную ошибку ограничения

#java #oracle #hibernate #kubernetes #concurrency

#java #Oracle #спящий режим #kubernetes #параллелизм

Вопрос:

У меня есть 2 модуля, каждый из которых запускает копию одного и того же корпоративного приложения Java, используя Hibernate. В основе лежит Oracle DB. Приложение имеет запланированный загрузчик для статических данных, который выполняется каждый наш, определенный cronjob. Загруженный результат будет сохранен в базе данных. Это означает, что оба модуля выполняют планировщик в один и тот же момент.

После того, как я усекаю таблицу, я сохраняю результат как объекты, с entityManager.merge(..) помощью которых, по моему мнению, должна быть решена проблема, поскольку она должна перезаписать существующую строку. Это, скорее всего, не работает, потому что два экземпляра модулей EntityManager не знают друг друга и, вероятно, все еще производят вставки, которые заканчиваются конфликтом.

Я уже рассматривал возможность игнорирования ошибки дублирования ключа, но мне было интересно, может ли быть более чистое решение.

Как я могу обрабатывать несколько экземпляров, которые одновременно записывают в БД?

Комментарии:

1. вы можете попробовать заблокировать БД. «заблокировать БД — если еще нет — записать в БД — снять блокировку»

Ответ №1:

Вам нужен способ предотвратить одновременный доступ. Взгляните на эту библиотеку https://github.com/lukas-krecan/ShedLock который вы можете использовать для реализации механизма блокировки с использованием JDBC.