sql >> Database teknologi >  >> RDS >> Mysql

Lige meget hvad, kan jeg ikke batch MySQL INSERT-sætninger i Hibernate

Det er sandsynligt, at dine forespørgsler bliver omskrevet, men du ville ikke vide det ved at se på Hibernate SQL-logfilerne. Hibernate omskriver ikke insert-sætningerne - MySQL-driveren omskriver dem. Med andre ord vil Hibernate sende flere indsætningsudsagn til chaufføren, og derefter vil chaufføren omskrive dem. Så Hibernate-logfilerne viser dig kun, hvad SQL Hibernate sendte til driveren, ikke hvilken SQL driveren sendte til databasen.

Du kan bekræfte dette ved at aktivere MySQL's profileSQL-parameter i forbindelses-url:

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

Ved at bruge et eksempel, der ligner dit, ser mit output sådan ud:

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)

De første 10 linjer bliver logget af Hibernate, men det er ikke det, der rent faktisk sendes til MySQL-databasen. Den sidste linje kommer fra MySQL-driveren, og den viser tydeligt en enkelt batch-indsættelse med flere værdier, og det er det, der rent faktisk sendes til MySQL-databasen.




  1. Er der en måde at begrænse resultatet med ELOQUENT ORM of Laravel?

  2. Udskrivning af værdien af ​​en variabel i SQL Developer

  3. Er der MySQL.. INSERT ... PÅ DUPLICATE KEY SELECT?

  4. PL/pgSQL-funktioner:Sådan returneres en normal tabel med flere kolonner ved hjælp af en execute-sætning