Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Egal was passiert, ich kann keine MySQL INSERT-Anweisungen in Hibernate stapeln

Es ist wahrscheinlich, dass Ihre Abfragen neu geschrieben werden, aber Sie würden dies nicht wissen, wenn Sie sich die Hibernate-SQL-Protokolle ansehen. Hibernate schreibt die Insert-Anweisungen nicht um - der MySQL-Treiber schreibt sie um. Mit anderen Worten, Hibernate sendet mehrere Insert-Anweisungen an den Treiber, und der Treiber schreibt sie dann neu. Die Hibernate-Protokolle zeigen Ihnen also nur, was SQL Hibernate an den Treiber gesendet hat, nicht, was der Treiber an die Datenbank gesendet hat.

Sie können dies überprüfen, indem Sie den profileSQL-Parameter von MySQL in der Verbindungs-URL:

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

Unter Verwendung eines ähnlichen Beispiels wie Ihres sieht meine Ausgabe so aus:

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)

Die ersten 10 Zeilen werden von Hibernate protokolliert, obwohl dies nicht das ist, was tatsächlich an die MySQL-Datenbank gesendet wird. Die letzte Zeile kommt vom MySQL-Treiber und zeigt deutlich eine einzelne Stapeleinfügung mit mehreren Werten, und das ist es, was tatsächlich an die MySQL-Datenbank gesendet wird.