Spring Hibernate JDBC размер партии - PullRequest
3 голосов
/ 14 марта 2011

У меня есть несколько сценариев, которые, на мой взгляд, немного неясны из спящей документации .

Класс данных:

class HibernateDao {
      // ...

      @Transactional
      public void store(List<Object> batch) {
          for(Object o : batch) {
             hibernate.store(o);
          }
      }
}

Сценарий 1

hibernate.jdbc.batch_size = 1

Q1 : Что происходит при вызове store(..) с коллекцией 10 предметов? Будет ли 10 x 1 транзакций или только одна?


Сценарий 2

hibernate.jdbc.batch_size = 10

Q2 : Что происходит при вызове store(..) с коллекцией 1 предметов? Будет ли оно немедленно записано в резервное хранилище независимо от свойства batch_size?


Из документации по спящему режиму:

Hibernate отключает пакетную вставку на уровне JDBC прозрачно, если вы используете генератор идентификаторов

Q3 : Что классифицируется как identify identifier generator с использованием аннотаций @Id и @GeneratedValue(strategy = GenerationType.AUTO)?

1 Ответ

7 голосов
/ 14 марта 2011

Q1: Что происходит при вызове store (..) с коллекцией из 10 предметов? Будет ли 10 х 1 транзакций или только одна?

Это характерно для транзакций Spring, но что касается Hibernate, если вы используете один сеанс и одну «транзакцию», она будет ожидать «сброса» или «фиксации» для фактического выполнения операций. Итак, одна транзакция.

Q2: Что происходит при вызове store (..) с коллекцией из 1 предметов? Будет ли оно немедленно записано в резервное хранилище независимо от свойства batch_size?

Не сразу. То же, что и в предыдущем ответе, применимо и здесь: если вы явно не попросите «сброс», Hibernate выполнит действие на этапе фиксации.

В3. Что классифицируется как генератор идентификаторов с использованием аннотаций @Id и @GeneratedValue (стратегии = GenerationType.AUTO)?

Все, что Hibernate не может предсказать в качестве идентификатора. Например, идентичность (например, последовательности, но для баз данных T-SQL), автоинкремент, последовательности ... Причина проста: Hibernate не знает, каким будет сгенерированный идентификатор для каждого из пакетных объектов, поэтому состояние объекта после вставка будет отличаться от состояния до. Hibernate обрабатывает это в обычных сценариях, вызывая метод JDBC для «getGeneratedKeys», что позволяет ему синхронизировать данные из базы данных с данными в своем сеансе, но это невозможно сделать для пакетов.

Если Hibernate знает, каким будет идентификатор для сущностей (то есть: назначен, hilo, uuid, ...), он может безопасно выполнить пакетное выполнение.

...