sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo funciona la inserción por lotes de Hibernate?

Propiedad de Hibernate hibernate.jdbc.batch_size es una forma de que Hibernate optimice su declaración de inserción o actualización, mientras que el ciclo de descarga se trata de agotamiento de la memoria.

Sin tamaño de lote cuando intenta guardar una declaración de inserción hibernate fire 1 de entidad, por lo tanto, si trabaja con una gran colección, para cada declaración save hibernate fire 1

Imagine el siguiente fragmento de código:

for(Entity e : entities){
session.save(e);
}

Aquí hibernate disparará 1 declaración de inserción por entidad en su colección. si tiene 100 elementos en su colección, entonces 100 declaraciones de inserción serán disparadas. Este enfoque no es muy eficiente por 2 razones principales:

  • 1) Aumenta exponencialmente su caché de primer nivel y probablemente terminará pronto con una OutOfMemoryException .
  • 2) Usted degrada el rendimiento debido al viaje de ida y vuelta de la red para cada declaración.

hibernate.jdbc.batch_size y el ciclo de descarga tienen 2 propósitos diferentes pero son complementarios.

Hibernate usa el primero para controlar cuántas entidades habrá en lote. Debajo de la cubierta, Hibernate usa java.sql.Statement.addBatch(...) y executeBatch() métodos.

Entonces hibernate.jdbc.batch_size le dice a hibernate cuántas veces tiene que llamar a addBatch() antes de llamar a executeBatch() .

Por lo tanto, configurar esta propiedad no evita que se agote la memoria.

Para cuidar la memoria, debe vaciar su sesión regularmente y este es el propósito del ciclo de vaciado.

Cuando escribes:

for(Entity e : entities){
if (i % 100 == 0 && i>0) {
                    session.flush();
                    session.clear();
                }
}

le está diciendo a Hibernate que vacíe y borre la sesión cada 100 entidades (libera memoria).

Entonces, ¿cuál es el vínculo entre los 2?

Para que sea óptimo, debe definir su jdbc.batch_size y su parámetro de descarga idéntico.

si define un parámetro de vaciado más bajo que el tamaño de lote que elija, hibernate vaciará la sesión con más frecuencia y creará un lote pequeño hasta que llegue al tamaño de btach, que no es eficiente

cuando los 2 son iguales, hibernate solo ejecutará lotes de tamaño óptimo, excepto el último, si el tamaño de la colección no es un múltiplo de su lote_tamaño.

Puede ver lo siguiente publicar para más detalles sobre este último punto