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

Hibernate Relationship Mapping/Batch Inserts beschleunigen

Die ID-Generierungsstrategie ist entscheidend für das Einfügen von Stapeln in Hibernate. Insbesondere die IDENTITY-Generierung wird normalerweise nicht funktionieren (beachten Sie, dass AUTO normalerweise auch IDENTITY zuordnet). Dies liegt daran, dass Hibernate während der Stapeleinfügung ein Flag namens "requiresImmediateIdAccess" hat, das angibt, ob generierte IDs sofort erforderlich sind oder nicht; in diesem Fall ist die Stapelverarbeitung deaktiviert.

Sie können dies leicht in den Protokollen auf DEBUG-Ebene erkennen, wenn dort steht „Identitätseinfügung wird sofort ausgeführt“ – dies bedeutet, dass die Stapelverarbeitung übersprungen wurde, da mitgeteilt wurde, dass generierte IDs sofort nach dem Einfügen erforderlich sind.

Generierungsstrategien, die normalerweise ausreichen Arbeit sind TABLE und SEQUENCE, da Hibernate die IDs vorgenerieren kann, wodurch das Einfügen von Stapeln ermöglicht wird.

Ein schneller Weg, um festzustellen, ob Ihre Batch-Einfügung funktioniert, besteht darin, Protokolle auf DEBUG-Ebene zu aktivieren, da BatchingBatcher Ihnen explizit die Batch-Größe mitteilt, die es ausführt ("Executing batch size:" + batchSize ).

Außerdem sind die folgenden Eigenschaften wichtig, um eine Stapeleinfügung zu erreichen. Ich wage nicht zu sagen, dass sie erforderlich sind, da ich nicht genug Hibernate-Experte dafür bin - vielleicht liegt es nur an meiner speziellen Konfiguration -, aber meiner Erfahrung nach wurden sie trotzdem benötigt:

hibernate.order_inserts = true
hibernate.order_updates = true

Diese Eigenschaften sind ziemlich schlecht dokumentiert, aber ich glaube, sie haben es ermöglicht, dass die SQL INSERT- und UPDATE-Anweisungen für die Batch-Ausführung richtig gruppiert werden; Ich denke, das könnten die mehrreihigen Einsätze sein, nach denen Sie suchen. Erschießen Sie mich nicht, wenn ich hier falsch liege, ich erinnere mich aus dem Gedächtnis.

Ich gehe auch weiter und gehe davon aus, dass Sie die folgende Eigenschaft festlegen; wenn nicht, sollte dies als Erinnerung dienen:

hibernate.jdbc.batch_size = xx

Wobei xx natürlich Ihre gewünschte Stapelgröße ist.