2012-08-22 17 views
5

¿Es posible insertar varias entidades en DB con una sola consulta? Cuando utilizo un ejemplo de here puedo ver varias consultas en el depurador WebDoctrine2 Batch Insert

ACTUALIZADO 23.08.2012

encontré los siguientes enlaces relacionados. Espero que le ayudará a alguien a entender un procesamiento por lotes:

  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

Los elementos principales:

Algunas personas parecen estar preguntándose por qué Doctrine no usa multi-insertos (insertar en (...) valores (...), (...), (...), ...

En primer lugar, esta sintaxis solo se admite en mysql y versiones postgresql más nuevas. En segundo lugar, no hay una manera fácil de obtener todos los identificadores generados en dicha multiinserción cuando se utiliza AUTO_INCREMENT o SERIAL y un ORM necesita los identificadores para la gestión de la identidad de los objetos. Por último, el rendimiento de inserción rara vez es el cuello de botella de un ORM. Las inserciones normales son más que suficientemente rápidas para y si realmente desea hacer inserciones rápidas, entonces una inserción múltiple no es la mejor manera, es decir, Postgres COPY o Mysql LOAD DATA INFILE son varios órdenes de magnitud más rápidos .

Estas son las razones por las que no vale la pena el esfuerzo implementar una abstracción que realice insertaciones múltiples en mysql y postgresql en un ORM. Espero que aclare algunas preguntas.

Respuesta

0

Creo que habrá varias instrucciones de inserción, pero solo una consulta a la base de datos por llamada "flush".

Como se ha mencionado aquí http://doctrine-orm.readthedocs.org/en/2.0.x/reference/working-with-objects.html

Cada "persistir" agregará una operación a la corriente UnitOfWork, entonces es la llamada a EntityManager # flush(), que en realidad escribir en la base de datos (que encapsula toda la operación de UnitOfWork en una sola transacción).

Pero no he comprobado que el comportamiento que describo arriba sea el comportamiento real.

Saludos, Christophe

+0

Gracias por su respuesta, pero no estoy seguro de que 'sólo una consulta a la base de datos por call' "flush", porque se puede ver a un tiempo de ejecución de cada instrucción INSERT . Significa que cada instrucción INSERT es una consulta a DB. Actualicé mi pregunta – Mikhail