во-первых, пожалуйста, извините мою относительную неопытность с Hibernate, я действительно использовал ее только в довольно стандартных случаях, и, конечно, никогда в сценарии, где мне приходилось управлять первичным ключом (@Id) самостоятельно, где я считаю, что мой проблемы ложь.
Краткое содержание: Я загружаю информацию профиля Facebook в пакетном режиме через пакетный API FB, и мне нужно отразить эту информацию в локальной базе данных. Все это хорошо, но у меня возникают проблемы, когда я пытаюсь сделать это параллельно.
Представьте себе очередь сообщений, обрабатывающую пакеты данных друзей параллельно и множество одинаковых общих лайков и ссылок (между друзьями), и в этом моя проблема.
Я сталкиваюсь с повторяющимися исключениями Hibernate ConstraintViolationException, которые возникают из-за повторяющихся записей PK - поскольку одна транзакция пыталась сбросить свой сеанс после определения объекта как переходного, когда фактически другая транзакция уже сделала то же самое определение и победила первую для принятия, в результате чего:
Duplicate entry '121528734903' for key 'PRIMARY'
И возникает исключение ConstraintViolationException.
Мне удалось почти преодолеть это, удалив все каскадирование из родительской сущности и выполняя атомарные записи, по одной записи на транзакцию и пытаясь просто перехватывать любые исключения, игнорируя их, если они происходят, как я Я знаю, что другая транзакция уже выполнила свою работу, но я не очень доволен этим решением и не могу представить, что это наиболее эффективное использование hibernate.
Я бы приветствовал любые предложения относительно того, как я мог бы улучшить архитектуру ...
В настоящее время используется: Hibernate 3.5.6 / Spring 3.1 / MySQL 5.1.30
Добавление: в данный момент я использую hibernate merge (), который первоначально проверяет наличие строки и либо сливает (обновляет), либо вставляет в зависимости от существования, проблема даже с уровнем изоляции READ_UNCOMMITTED, иногда неверное определение, то есть две транзакции решают одно и то же, и я снова получил исключение.
Блокировка на самом деле мне тоже не помогает, оптимистическая или пессимистическая, поскольку условие является лишь проблемой в начальном случае вставки, и нет строки для блокировки, что очень затрудняет обработку параллелизма ...
Должно быть, я что-то упустил, но я прочитал, я волнуюсь, что из-за того, что я не могу выйти из спящего режима для управления ПК, я как бы огорчен - так как он проверяет существование в начале сеанса и приходит время для синхронизации состояние сеанса недопустимо.
Кто-нибудь с любым предложением для меня ..? Благодарю.