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

Pase lo que pase, no puedo agrupar declaraciones INSERT de MySQL en Hibernate

Es probable que sus consultas se estén reescribiendo, pero no lo sabría al mirar los registros SQL de Hibernate. Hibernate no reescribe las declaraciones de inserción:el controlador MySQL las reescribe. En otras palabras, Hibernate enviará múltiples declaraciones de inserción al controlador y luego el controlador las reescribirá. Entonces, los registros de Hibernate solo le muestran qué SQL envió Hibernate al controlador, no qué SQL envió el controlador a la base de datos.

Puede verificar esto habilitando el parámetro profileSQL de MySQL en la url de conexión:

<b:property name="jdbcUrl" value="jdbc:mysql://server:3306/db?autoReconnect=true&amp;rewriteBatchedStatements=true&amp;profileSQL=true" />

Usando un ejemplo similar al tuyo, así es como se ve mi salida:

insert into Person (firstName, lastName, id) values (?, ?, ?)
insert into Person (firstName, lastName, id) values (?, ?, ?)
insert into Person (firstName, lastName, id) values (?, ?, ?)
insert into Person (firstName, lastName, id) values (?, ?, ?)
insert into Person (firstName, lastName, id) values (?, ?, ?)
insert into Person (firstName, lastName, id) values (?, ?, ?)
insert into Person (firstName, lastName, id) values (?, ?, ?)
insert into Person (firstName, lastName, id) values (?, ?, ?)
insert into Person (firstName, lastName, id) values (?, ?, ?)
insert into Person (firstName, lastName, id) values (?, ?, ?)
Wed Feb 05 13:29:52 MST 2014 INFO: Profiler Event: [QUERY]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) duration: 1 ms, connection-id: 81, statement-id: 33, resultset-id: 0, message: insert into Person (firstName, lastName, id) values ('person1', 'Name', 1),('person2', 'Name', 2),('person3', 'Name', 3),('person4', 'Name', 4),('person5', 'Name', 5),('person6', 'Name', 6),('person7', 'Name', 7),('person8', 'Name', 8),('person9', 'Name', 9),('person10', 'Name', 10)

Hibernate registra las primeras 10 líneas, aunque esto no es lo que realmente se envía a la base de datos MySQL. La última línea proviene del controlador MySQL y muestra claramente una sola inserción de lote con múltiples valores y eso es lo que realmente se envía a la base de datos MySQL.