Почему количество сбрасываемых объектов должно быть равно hibernate.jdbc.batch_size?
Как сказано в документации hibernate, при выполнении пакетных вставок / обновлений сеанс должен сбрасываться и очищаться, когда число объектов равно размеру пакета jdbc (hibernate.jdbc.batch_size
). Моя проблема в том, почему это число должно быть равно hibernate.jdbc.batch_size
, Есть ли совет по производительности?
Изменить: Например, подумайте, что я установил hibernate.jdbc.batch_size
до 30 в моем файле hibernate.cfg. Тогда, как говорит доктор, сессия должна быть сброшена, когда количество объектов равно 30. Почему я не должен сбрасывать, когда количество объектов равно 20 или 40?
1 ответ
Пакет JDBC состоит из следующих действий:
- добавить операторы вставки в пакет, сохраненный в памяти
- когда вы достигли заданного количества операторов вставки, записанных в пакете (или когда больше нет инструкций вставки, которые нужно выполнить), отправьте эту пакетную команду в базу данных за один прием, чтобы база данных фактически выполнила эти вставить заявления.
Очистка сеанса заключается в сообщении Hibernate: вставьте все, что хранится в памяти, в базу данных.
Таким образом, если размер пакета установлен на 30, и вы сбрасываете каждые 5 объектов, Hibernate будет выполнять множество небольших пакетов из 5 операторов вставки вместо выполнения в 6 раз меньше пакетов из 30 операторов. Поскольку вы определили, что 30 был оптимальным размером партии, при очистке каждых 5 объектов этот оптимальный размер не используется.
Если, наоборот, вы сбрасываете все 35 сущностей, то Hibernate выполнит пакет из 30 вставок, затем пакет из 5, затем пакет из 30, затем пакет из 5 и т. Д. И снова, вы не используя оптимальный размер партии.
Если вы сбрасываете каждые 30 сущностей, то hibernate будет выполнять только пакеты оптимального размера, за исключением последнего, если общее количество сущностей не кратно 30.