Блокировка Java Hibernate + Oracle 11.2 - PullRequest
2 голосов
/ 10 октября 2011

Мне нужно синхронизировать мою пользовательскую таблицу с хранилищем (другой БД) во время запуска приложения. У меня есть два узла Tomcat с Apache mod_jk. Поэтому, когда я перезагружаю их оба, я делаю двойные вставки и двойные обновления. Это похоже на: Начало T1 Начало T2 T1 читать данные Т2 читать данные T1 изменить данные Т2 изменить те же данные Вставка T1 Вставка Т2 T1 коммит T2 commit

Когда T1 изменяет данные, а затем T2 изменяет те же данные, которые я потерял, обновление. И конечно у меня есть дубликаты во время операции вставки. Как мне сделать синхронизацию?

  1. Полагаю, я могу заблокировать всю таблицу, используя "select * for update" (например), и выполнить две синхронизации. Один полный, а другой пустой.
  2. Я могу создать для этого специальную таблицу и поместить туда столбец STATUS. Когда один узел запускается, он выполняет SELECT FOR UPDATE поля STATUS и изменяет его на «RUNNING». Когда другая транзакция читает STATUS, она не выполняет синхронизацию, если для нее установлено значение «RUNNING».

Какое лучшее решение? Любые другие предложения. Спасибо!

Ответы [ 2 ]

1 голос
/ 10 октября 2011

Проблема в том, что запуск сервера не означает запуск приложения, если для размещения приложения используется более одного сервера.

Если вы всегда запускаете и останавливаете оба сервера одновременно, просто настройте только один из них (через параметр config в файле web.xml или системное свойство) для выполнения синхронизации.

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

0 голосов
/ 22 апреля 2013

Сконфигурируйте один сервер, чтобы он не выполнял синхронизацию - как сказал JB Nizet.В нашем проекте мы используем пружинные профили .

В любом случае, вы не должны получать дубликаты, если вы определили уникальный индекс для бизнес-ключа.Вы можете избавиться от потерянных обновлений Oracle, используя оптимистическую блокировку в Hibernate.Транзакция будет пытаться обновить определенную версию (ту, которую она прочитала) и получит ошибку, если другая транзакция обновит ее с помощью счетчика новой версии.

...