Hibernate High Concurrency и определенные пользователем @Id - PullRequest
0 голосов
/ 11 октября 2011

во-первых, пожалуйста, извините мою относительную неопытность с 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, иногда неверное определение, то есть две транзакции решают одно и то же, и я снова получил исключение.

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

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

Кто-нибудь с любым предложением для меня ..? Благодарю.

1 Ответ

0 голосов
/ 11 октября 2011

Возьмем это с большой долей соли, поскольку я очень мало знаю о Hibernate, но, похоже, вам нужно указать, что вместо стандартного оператора mysql INSERT сделан оператор INSERT IGNORE.Возможно, вы захотите взглянуть на @SQLInsert в Hibernate, я думаю, что именно здесь вам нужно будет указать точный оператор вставки, который следует использовать.Извините, я не могу помочь с синтаксисом, но я думаю, что вы, вероятно, можете найти то, что вам нужно, посмотрев документацию Hibernate для @SQLInsert и, если необходимо, документацию MySQL для INSERT IGNORE.

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