2014-12-13 4 views
0

Я новичок в спящий режим у меня есть сомнения в спящий режим пакетной обработки, я читал некоторые учебник для обработки спящего режима пакетной они сказалиЧто такое использование обработки спящего режима пакетной

Session session = SessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 
for (int i=0; i<100000; i++) 
{ 
    Employee employee = new Employee(.....); 
    session.save(employee); 

} 
tx.commit(); 
session.close(); 

Hibernate будет кэшировать все сохранялось объекты в кеш-кеш-кеш и, в конечном итоге, ваше приложение упадет с OutOfMemoryException где-то около 50 000-й строки. Вы можете решить эту проблему, если вы используете пакетную обработку с Hibernate, как,

Session session = SessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 
for (int i=0; i<100000; i++) 
{ 
Employee employee = new Employee(.....); 
session.save(employee); 
if(i % 50 == 0) 
{ // Same as the JDBC batch size 
    //flush a batch of inserts and release memory: 
    session.flush(); 
    session.clear(); 
} 
} 
tx.commit(); 
session.close(); 

Мои сомнения вместо инициализации сеанса снаружи, почему мы не можем инициализировать его на цикл, как,

Session session = null; 
Transaction tx = session.beginTransaction(); 
for (int i=0; i<100000; i++) 
{ 
session =SessionFactory.openSession() 
Employee employee = new Employee(.....); 
session.save(employee); 
} 
tx.commit(); 
session.close(); 

Правильно ли это, или никто не предлагает мне правильный путь?

+0

Просто нашел статью о [пакетная обработка в спящем режиме] (http://onetouchcode.com/2016/08/21/batch-processing-example-in-hibernate/) – Shailendra

ответ

2

№ Не инициализируйте сеанс в цикле for; каждый раз, когда вы начинаете новый сеанс, вы начинаете новую партию (так что у вас есть размер партии по одному вашему пути, то есть она не является пакетной). Кроме того, это будет много медленнее ваш путь. Вот почему в первом примере есть

if(i % 50 == 0) { 
    //flush a batch of inserts and release memory: 
    session.flush(); 
    session.clear(); 
} 

Это то, что было «залить партию вставок и освободить память».

+0

oh! спасибо, и я еще сомневаюсь, если я использую 30 могу ли я использовать if (i% 50 == 0) {session.flush(); session.clear();}? –

+1

Конечно, но это не оптимально. Размер партии ** должен совпадать **. –

+0

Огромное спасибо, теперь я прояснил эту концепцию. –

1

Batch Processing в Hibernate означает разделение задачи огромных чисел на некоторые более мелкие задачи.

Когда вы запускаете session.save(obj), hibernate фактически кэширует этот объект в свою память (все же объект не записывается в базу данных) и сохранит его в базе данных при совершении транзакции i.e при вызове transactrion.commit().

Допустим, у вас есть миллионы записей для ввода, поэтому увольнение session.save(obj) будет потреблять много памяти и в итоге приведет к OutOfMemoryException.

Создание простой партии меньшего размера и сохранение их в базе данных.

if(i % 50 == 0) { 
    //flush a batch of inserts and release memory: 
    session.flush(); 
    session.clear(); 
} 

Примечание: В коде выше session.flush() бы flush т.е. фактически сохранить объекты в базу данных и session.clear() очистит любую память, занятую этими объектами для выпечки размером 50

Смежные вопросы