Mysql
 sql >> база данни >  >> RDS >> Mysql

Как работи Hibernate Batch insert?

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.

Можете да видите следното публикация за повече подробности относно тази последна точка



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Специални символи в MySQL Име на таблица

  2. mysql ГРЕШКА 2002 (HY000):Не може да се свърже с локален MySQL сървър чрез сокет '/var/run/mysqld/mysqld.sock' (2)

  3. MySQL вмъкване в DATETIME:безопасно ли е да се използва ISO::8601 формат?

  4. Как да импортирам MySql конектор в Unity Project?

  5. Mysql Concat две колони, докато търсите с LIKE