Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Não importa o que aconteça, não consigo agrupar instruções MySQL INSERT no Hibernate


É provável que suas consultas estejam sendo reescritas, mas você não saberia se examinando os logs do Hibernate SQL. O Hibernate não reescreve as instruções insert - o driver MySQL as reescreve. Em outras palavras, o Hibernate enviará várias instruções de inserção para o driver e, em seguida, o driver as reescreverá. Portanto, os logs do Hibernate mostram apenas o SQL que o Hibernate enviou ao driver, não o SQL que o driver enviou ao banco de dados.

Você pode verificar isso habilitando o parâmetro profileSQL do MySQL na url de conexão:
<b:property name="jdbcUrl" value="jdbc:mysql://server:3306/db?autoReconnect=true&amp;rewriteBatchedStatements=true&amp;profileSQL=true" />

Usando um exemplo semelhante ao seu, é assim que minha saída se parece:
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)

As primeiras 10 linhas estão sendo registradas pelo Hibernate, embora isso não seja o que realmente está sendo enviado para o banco de dados MySQL. A última linha vem do driver MySQL e mostra claramente uma única inserção de lote com vários valores e é isso que está realmente sendo enviado para o banco de dados MySQL.