Если вы контролируете код для всех экземпляров, то вы можете создать таблицу в базе данных, где каждый запускаемый экземпляр ищет в этой таблице запись с отметкой времени. Давайте назовем это вашей "замковой" записью.
Если процесс обнаруживает, что запись о блокировке не существует, он вставляет запись и обрабатывает требуемые данные.
Если процесс обнаруживает, что запись о блокировке существует, вы можете предположить, что ее создал другой процесс, и ничего не делать, ждать или делать что-то еще.
При таком дизайне вы фактически создаете «замок» в базе данных для синхронизации ваших процессов. Вы кодируете это, поэтому все процессы знают, что они должны придерживаться логики записи блокировки.
Как только первый процесс, имеющий блокировку, завершит обработку, он должен очистить запись блокировки, чтобы следующий перезапуск вел себя правильно. Вам также нужно подумать о ситуации, когда блокировка не была снята из-за ошибки сервера или ошибки выполнения. Как правило, если блокировка старше n
минут, вы можете считать ее «устаревшей», поэтому удалите ее и создайте заново (или просто обновите).
При работе с записью «lock» обязательно используйте изоляцию Serializable. level на вашем соединении с БД, чтобы гарантировать атомарность.
Уровень Сервис вашего кода Java может принудительно применить вашу стратегию блокировки до вызова уровня Доступ к данным. Неважно, используете вы Hibernate или нет, так как это просто логика приложения.
person
Brad
schedule
06.09.2012