Hibernate property hibernate.jdbc.batch_size
е начин за хибернация да оптимизира вашата инструкция за вмъкване или актуализиране, докато цикълът за изтриване е свързан с изчерпване на паметта.
Без размер на партидата, когато се опитвате да запишете обект hibernate fire 1 инструкция за вмъкване, така че ако работите с голяма колекция, за всяко save hibernate fire 1 оператор
Представете си следната част от кода:
for(Entity e : entities){
session.save(e);
}
Тук hibernate ще задейства 1 оператор за вмъкване на обект във вашата колекция. ако имате 100 елемента във вашата колекция, така че 100 оператора за вмъкване ще бъдат fire. Този подход не е много ефективен поради 2 основни причини:
- 1) Увеличавате експоненциално своя кеш от 1-во ниво и вероятно скоро ще приключите с
OutOfMemoryException
. - 2) Влошавате производителността поради двупосочно пътуване на мрежата за всяко изявление.
hibernate.jdbc.batch_size и цикълът за прочистване имат 2 различни цели, но се допълват.
Hibernate използвайте първия, за да контролирате колко обекти ще бъдат в пакет. Под корицата Hibernate използвайте java.sql.Statement.addBatch(...)
и executeBatch()
методи.
Така hibernate.jdbc.batch_size казва на hibernate колко пъти трябва да извика addBatch()
преди да извикате executeBatch()
.
Така че задаването на това свойство не ви предпазва от изчерпване на паметта.
За да се грижите за паметта, трябва редовно да изтривате сесията си и това е целта на цикъла за изчистване.
Когато пишете :
for(Entity e : entities){
if (i % 100 == 0 && i>0) {
session.flush();
session.clear();
}
}
казвате на hibernate да изчисти и изчисти сесията на всеки 100 обекта (освобождавате памет).
И сега каква е връзката между 2?
За да бъде оптимално, трябва да дефинирате своя jdbc.batch_size
и вашият параметр за промиване е идентичен.
ако дефинирате параметър за flush по-нисък от избрания от вас batch_size, така hibernate ще изтрива сесията по-често, така че ще създаде малка партида, докато достигне до btach size, което не е ефективно
когато 2-те са еднакви, хибернацията ще изпълнява само партиди с оптимален размер, с изключение на последния, ако размерът на колекцията не е кратен на вашия batch_size.
Можете да видите следното публикация за повече подробности относно тази последна точка