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