Hibernate + одновременные вставки (MySQL INSERT IGNORE) - PullRequest
4 голосов
/ 08 января 2011

Я учусь использовать Hibernate. Мне интересно, как сделать одновременные вставки в спящем режиме правильно.

У меня есть таблица URL, определенная как:

CREATE TABLE `urls` (
    id INT PRIMARY KEY AUTO_INCREMENT, 
    md5 CHAR(32) UNIQUE, 
    url TEXT
);

Цель таблицы - поддерживать идентификатор отображения <-> url. Поле md5 является суммой md5 от url, так как в общем случае url может быть длиннее 1024 байтов, что является ограничением для уникального ограничения в mysql.

Мой вопрос о запросе для функции url-> id, обрабатывающей параллелизм. В реализации JDBC я делаю эти шаги:

  1. ВЫБЕРИТЕ идентификатор, ГДЕ md5 = md5 (url);
  2. если существует, вернуть id, иначе:
  3. ВСТАВИТЬ ИГНОРА В ЗНАЧЕНИЯ URL (MD5, URL) (MD5 (URL), URL);
  4. Повторите шаг 1.

Хорошо работает, даже если запрошенный URL вставлен между шагами 2 и 3. Как мне сделать это с Hibernate?

1 Ответ

2 голосов
/ 08 января 2011

Вы можете поиграть с аннотацией @ SQLInsert . Это позволяет вам указать, какой оператор SQL использовать во время вставки. Проблема в том, что Hibernate делает гораздо больше, чем просто вставляет / обновляет / выбирает данные из базы данных. Тем не менее, я вполне уверен, что поначалу простое использование @SQLInsert может сработать, но я не уверен, как Hibernate будет вести себя при попадании в описанный вами сценарий (одновременная вставка между шагами 2 и 3), особенно потому, что не выполняет шаг 4. Вместо этого он вызывает JDBC «getGeneratedKeys» для получения идентификатора, который был сгенерирован (который, я подозреваю, будет нулевым, если вставка была проигнорирована).

Короче говоря: единственное решение, которое я вижу, это использование @SQLInsert, но вы захотите поиграть с этим и убедиться, что Hibernate работает правильно, когда происходит параллельная вставка.

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