2012-08-22 8 views
5

Ist es möglich, mehrere Einheiten an die DB mit einer einzigen Abfrage einfügen? Wenn ich ein Beispiel aus here verwende ich mehrere Anfragen im Web-DebuggerDoctrine2 Batch Insert

AKTUALISIERT 23.08.2012

sehen, fand ich die folgenden Links zum Thema. Ich hoffe, dass es jemand helfen wird, eine Batch-Verarbeitung zu verstehen:

  1. http://www.doctrine-project.org/blog/doctrine2-batch-processing.html
  2. doctrine2 - How to improve flush efficiency?
  3. Doctrine 2: weird behavior while batch processing inserts of entities that reference other entities

Die wichtigsten Dinge:

Einige Leute scheinen zu fragen, warum Lehre verwendet nicht Multi-Einsätze (Einsatz in (...) Werte (...) (...) (...), ...

Zunächst einmal ist diese Syntax nur auf mysql und neuere postgresql Versionen unterstützt. Zweitens gibt es keine einfache Möglichkeit, halten alle die generierten Identifikatoren in solchen Mehreinsatz zu erhalten, wenn AUTO_INCREMENT oder serial und ein ORM muss die Kennungen für Identität Verwaltung der Objekte. Schließlich ist Einfügeleistung selten der Engpass eines ORM. Normale Einsätze sind mehr als schnell genug für meisten Situationen und wenn Sie wirklich schnell Bulk-Einsätze machen wollen, dann ist ein Multi-Einsatz ist nicht der beste Weg, wie auch immer, das heißt Postgres COPY oder Mysql LOAD DATA INFILE sind um mehrere Größenordnungen schneller .

Dies sind die Gründe, warum es nicht der Mühe wert ist, eine Abstraktion zu implementieren, die ein ORM in Multi-Einsätze auf MySQL und PostgreSQL führt. Ich hoffe, dass das einige Fragezeichen aufräumt.

Antwort

0

Ich denke, dass es mehrere Insert-Anweisungen geben wird, aber nur eine Abfrage an die Datenbank pro "Flush" -Aufruf.

Wie hier erwähnt http://doctrine-orm.readthedocs.org/en/2.0.x/reference/working-with-objects.html

Jedes „bestehen“ wird eine Operation zum aktuellen UnitOfWork hinzufügen, dann ist es der Aufruf von EntityManager # flush(), die in die Datenbank tatsächlich schreiben wird (Einkapseln alle den Betrieb von UnitOfWork in einer einzigen Transaktion).

Aber ich habe nicht überprüft, dass das Verhalten, das ich oben beschreiben das tatsächliche Verhalten ist.

Mit freundlichen Grüßen, Christophe

+0

Vielen Dank für Ihre Antwort, aber ich bin nicht sicher, dass 'nur eine Abfrage an die Datenbank per„flush“call', weil ich eine Zeit der Ausführung für jede INSERT-Anweisung sehen . Dies bedeutet, dass jede INSERT-Anweisung eine Abfrage an die DB ist. Ich habe meine Frage aktualisiert – Mikhail