Hibernate Performance flush v commit - PullRequest
       9

Hibernate Performance flush v commit

2 голосов
/ 02 апреля 2011

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

Я знаю об основных различиях между flush v commit, например, flush синхронизирует «грязные» данные с постоянными базовыми данными, и этот flush позволяет синхронизировать с базовыми постоянными данными без фактической фиксации, чтобы транзакция могла откатиться при необходимости. По существу, фиксация фиксирует все постоянные данные в базе данных.

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

Я знаю об основных различиях между flush v commit, например, flush синхронизирует «грязные» данные с постоянными базовыми данными, и этот flush позволяет синхронизировать с базовыми персистентными данными без фактической фиксации, чтобы транзакция могла откатиться при необходимости. По существу, фиксация фиксирует все постоянные данные в базе данных.

Какой разумный размер для пакетной вставки? IS 50 максимальная сумма для разумной производительности, что-то вроде:

for (i < 1000000)
    if(i % 50 ) {
        session.flush()
    }

Я считаю, что 50 должно соответствовать значению в hibernate.jdbc.batch_size 50

1 Ответ

1 голос
/ 12 апреля 2011

Это зависит от ваших данных.Размер пакета - это баланс между количеством элементов, которые Hibernate сохранит в своем сеансе , и задержкой, связанной с выполнением обращений к БД для сброса.Если размер вашей партии слишком мал, вы в конечном итоге совершите много поездок в БД.Если размер вашего пакета слишком велик, вы в конечном итоге будете удерживать много объектов в сеансе hibernate - это может быть проблемой, если ваши объекты толстые.

Я бы сказал, 50 - это небольшое число: 1M / 50 = 20000 поездки туда и обратно,Я бы сказал, чтобы вы начали с большего числа и измерили производительность.Кстати, это относится только к пакетным операциям: hibernate.jdbc.batch_size - это 50 для обычных транзакций приложения.

PS не забудьте очистить сеанс гибернации после сброса, иначе гибернация сохранит сохраненные объекты впамять даже после сброса.

...