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

Mapeo de relaciones de Hibernate/Acelerar inserciones por lotes

La estrategia de generación de ID es fundamental para la inserción por lotes en Hibernate. En particular, la generación de IDENTIDAD por lo general no trabajo (tenga en cuenta que AUTO normalmente también se asigna a IDENTIDAD). Esto se debe a que, durante la inserción por lotes, Hibernate tiene un indicador llamado "requiresImmediateIdAccess" que indica si los ID generados se requieren inmediatamente o no; si es así, el procesamiento por lotes está deshabilitado.

Puede detectar esto fácilmente en los registros de nivel DEBUG cuando dice "ejecutando la inserción de identidad inmediatamente"; esto significa que se ha saltado el procesamiento por lotes porque se le dijo que las ID generadas son necesarias inmediatamente después de la inserción.

Estrategias de generación que típicamente hacen son TABLE y SEQUENCE, porque Hibernate puede pregenerar los ID, lo que permite la inserción por lotes.

Una forma rápida de detectar si la inserción de su lote funciona es activar los registros de nivel DEBUG, ya que BatchingBatcher le indicará explícitamente el tamaño del lote que está ejecutando ("Tamaño del lote en ejecución:" + tamaño del lote).

Además, las siguientes propiedades son importantes para lograr la inserción por lotes. No me atrevo a decir que son necesarios, ya que no soy lo suficientemente experto en Hibernate para hacerlo, tal vez sea solo mi configuración particular, pero en mi experiencia, no obstante, eran necesarios:

hibernate.order_inserts = true
hibernate.order_updates = true

Estas propiedades están bastante mal documentadas, pero creo que lo que hicieron fue habilitar que las declaraciones SQL INSERT y UPDATE se agruparan correctamente para la ejecución por lotes; Creo que estas podrían ser las inserciones de varias filas que buscas. No me dispares si me equivoco en esto, estoy recordando de memoria.

También seguiré adelante y supondré que establece la siguiente propiedad; si no, esto debería servir como recordatorio:

hibernate.jdbc.batch_size = xx

Donde xx es el tamaño de lote deseado, naturalmente.