Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Hibernate, как такое объснить?


Автор: unkis 16.6.2007, 19:21
Здравствуйте, у меня такая странная ситуация.

Я сохраняю в базу 5000 записей.
Так вот когда я сохраняю по одной записи в транзакцию, то всё в порядке, успешно сохраняются все 5000 записей, правда очень медленно,
но вот когда я сохраняю по 50 за одну транзакцию то вылетает ошибка следующего содержания.



Код

org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:249)
    at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:92)
    at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:87)
    at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:218)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2220)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2656)
    at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:52)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:232)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:139)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
    at de.hacon.contoller.Controller.saveDW(Controller.java:490)
    at de.hacon.contoller.Controller.start(Controller.java:204)
    at de.hacon.gui.MainPanel$3$1.run(MainPanel.java:132)
    at java.lang.Thread.run(Thread.java:619)
Caused by: java.sql.BatchUpdateException: Duplicate entry 'null-Ekerö, Ekvägen 10b-cluster' for key 1
    at com.mysql.jdbc.ServerPreparedStatement.executeBatch(ServerPreparedStatement.java:665)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)
    ... 18 more




Вопрос, почему по одной записи сохранение происходит нормально, а по 50 с ошибкой?
От чего это может зависеть?



Автор: w1nd 17.6.2007, 00:43
Вы создаёте объекты? Если да, поменяйте генератор ключей.
Какой способ гереации ключей используете?

Автор: kkorsakoff 17.6.2007, 13:45
А это разве не из-за того, что JDBC драйвер не поддерживает batch update?

Может надо поставить в cfg.xml вот так?

Код

<property name="jdbc.batch_size">0</property

Автор: ekr 17.6.2007, 14:11
Цитата(w1nd @  17.6.2007,  00:43 Найти цитируемый пост)
Вы создаёте объекты? Если да, поменяйте генератор ключей.

Мне тоже так кажется, ведь:
Цитата(unkis @  16.6.2007,  19:21 Найти цитируемый пост)
Caused by: java.sql.BatchUpdateException: Duplicate entry 'null-Ekerö, Ekvägen 10b-cluster' for key 1


unkis, может, имеет смысл показать кусочек кода сохранения/генерации ключей?

Автор: w1nd 17.6.2007, 15:25
Цитата(kkorsakoff @  17.6.2007,  13:45 Найти цитируемый пост)
А это разве не из-за того, что JDBC драйвер не поддерживает batch update?

Нет. Скорее всего нету автоинкремента для ключей в таблице и генератор используется вроде +1 или MAX.

Автор: unkis 17.6.2007, 15:34
Цитата(w1nd @  16.6.2007,  22:43 Найти цитируемый пост)
Вы создаёте объекты? Если да, поменяйте генератор ключей.


Поменял помогло, но всё равно не понятно, значит если по одной записи за транзакцию сохранять, то с ключами всё в порядке, а вот если пачками за транзакцию, то ему не нравится, ведь и в первом и во втором случаи ключи одинаковые.
Странно всё это как-то

Автор: ekr 17.6.2007, 17:01
Цитата(unkis @  17.6.2007,  15:34 Найти цитируемый пост)
Странно всё это как-то

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)