Czy zduplikowane błędy wejścia z Hibernate to wina MySQL?

Pracuję nad aplikacją bazodanową, która jest głównie do odczytu, ale jest jedna tabela, która rejestruje ruch użytkownika w aplikacji i ma dużą liczbę zapisów do niej. Za każde kilka tysięcy zapisów widzimy kilka wyjątków w dzienniku błędów, takich jak:

[WARN][2009-07-30 11:09:20,083][org.hibernate.util.JDBCExceptionReporter] SQL Error: 1062, SQLState: 23000
[ERROR][2009-07-30 11:09:20,083][org.hibernate.util.JDBCExceptionReporter] Duplicate entry '17011' for key 1
[ERROR][2009-07-30 11:09:20,083][org.hibernate.event.def.AbstractFlushingEventListener] Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
  at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94)
  at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
  at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)

Omawiana tabela ma następujący schemat:

CREATE TABLE IF NOT EXISTS `my_table` (
  `id` int(11) NOT NULL,
  `data1` int(11) NOT NULL,
  `data2` int(11) NOT NULL,
  `timestamp` datetime default NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

I odpowiadający mu XML mapowania Hibernate:

<hibernate-mapping>
  <class name="mycorp.MyClass" table="my_table">
    <id name="id" column="id" type="java.lang.Integer">
      <generator class="increment"/>
    </id>
    <property name="data1" column="data1" type="java.lang.Integer"/>
    <property name="data2" column="data2" type="java.lang.Integer"/>
    <property name="timestamp" column="timestamp" type="java.util.Date"/>
  </class>
</hibernate-mapping>

Jest możliwe, choć mało prawdopodobne, że wiele wystąpień naszej aplikacji internetowej może zapisywać dane do bazy danych od razu, ponieważ numerujemy wersję w naszym kontekście aplikacji internetowej, aby bezproblemowo wypuszczać nowe wersje aplikacji. Klienci ze starą wersją aplikacji zapisaną w pamięci podręcznej w swojej przeglądarce internetowej uzyskaliby dostęp do starych wersji serwera, które uruchamiamy po kilku tygodniach.

W każdym razie nie jestem przekonany, że jest to problem, ale podejrzewam, że jest tu jakiś problem z synchronizacją między MySQL i Hibernate. Czy zmieniłbym generator na sekwencję, seqhilo lub hilo help? Ponadto, jeśli możesz podać przykład ustawienia takiego generatora w MySQL, byłoby to bardzo pomocne, ponieważ większość zasobów online jest po prostu kopiowana z żałośnie minimalistycznych przykładów w podręczniku Hibernate.

questionAnswers(1)

yourAnswerToTheQuestion