Проблема с использованием спящего режима в JVM - PullRequest
0 голосов
/ 19 апреля 2011

Мое приложение выполняет вызовы на сервер, который сгруппирован по 2 JVM.Запросы могут отправляться на любой сервер.Я использую Spring с Hibernate для вызовов БД (для базы данных DB2).Тем не менее, я заметил, что нет никакого автоматического механизма блокировки из Hibernate через JVM.Я реализовал механизм блокировки через что-то вроде - query.setLockMode ("myBo", LockMode.UPGRADE);Но это не похоже на работу с JVM.

Сценарий проблемы:

Первая JVM выбирает данные для обновления (с LockMode.UPGRADE на месте) из Таблицы1.Прежде чем первая JVM завершит обновление, вторая JVM также выберет данные из таблицы 1 (что не должно происходить).Первая JVM успешно завершает обновление.Но вторая JVM дает сбой (происходит обновление ключа индекса для Table1) с DuplicateKeyException.

Может кто-нибудь предложить, пожалуйста, решение для этого?

Спасибо Radhika

1 Ответ

1 голос
/ 19 апреля 2011

Это не связано с тем, что у вас есть несколько JVM.У вас может быть один и тот же сценарий с двумя параллельными потоками в одной JVM, потому что Hibernate вообще не делает никакой блокировки.Если вам нужна блокировка, используйте оптимистичные блокировки (используя атрибут версии) или блокировки в базе данных (с LockMode.UPGRADE).

Но оба механизма блокировки приведут к исключениям: они неизбежны, если у вас есть несколько параллельных транзакций, работающих с одними и теми же данными.Вы должны разработать свое приложение (то есть представить сообщения об ошибках, реализовать механизмы повторных попыток и т. Д.) С учетом этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...