2012-08-22 24 views
5

Có thể chèn một số thực thể vào DB bằng một truy vấn không? Khi tôi sử dụng một ví dụ từ here tôi có thể thấy một số truy vấn trong Debugger WebDoctrine2 Batch Insert

CẬP NHẬT 23.08.2012

tôi thấy các liên kết liên quan sau đây. Tôi hy vọng nó sẽ giúp một người nào đó hiểu được một xử lý hàng loạt:

  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

Những điều chính:

Một số người dường như tự hỏi tại sao Doctrine không sử dụng nhiều lần chèn (chèn vào (...) các giá trị (...), (...), (...), ...

Trước hết, cú pháp này chỉ được hỗ trợ trên các phiên bản postsql và mysql mới hơn. Thứ hai, không có cách nào dễ dàng để giữ tất cả các số nhận dạng được tạo ra trong một multi-insert như vậy khi sử dụng AUTO_INCREMENT hoặc SERIAL và ORM cần số nhận dạng để nhận dạng quản lý đối tượng. Cuối cùng, chèn hiệu suất hiếm khi là nút cổ chai của ORM. Chèn bình thường là đủ nhanh cho hầu hết các trường hợp và nếu bạn thực sự muốn chèn nhanh hàng loạt, thì một cách đa phương tiện không phải là cách tốt nhất, tức là Postgres COPY hoặc Mysql LOAD DATA INFILE là một số đơn đặt hàng có cường độ nhanh hơn .

Đây là những lý do tại sao nó không phải là giá trị nỗ lực để thực hiện một trừu tượng thực hiện đa chèn trên mysql và postgresql trong một ORM. Tôi hy vọng rằng xóa một số dấu hỏi.

Trả lời

0

Tôi nghĩ rằng sẽ có một số câu lệnh chèn, nhưng chỉ có một truy vấn vào cơ sở dữ liệu theo lệnh "xả".

Như đã đề cập ở đây http://doctrine-orm.readthedocs.org/en/2.0.x/reference/working-with-objects.html

Mỗi "tồn tại" sẽ thêm một hoạt động để các UnitOfWork hiện tại, sau đó nó là cuộc gọi đến EntityManager # flush() mà thực sự sẽ ghi vào cơ sở dữ liệu (đóng gói tất cả các hoạt động của UnitOfWork trong một giao dịch đơn lẻ).

Nhưng tôi chưa kiểm tra hành vi mà tôi mô tả ở trên là hành vi thực tế.

Trân trọng, Christophe

+0

Cảm ơn phản hồi của bạn, nhưng tôi không chắc chắn rằng 'chỉ có một truy vấn đến cơ sở dữ liệu mỗi "tuôn ra" call', vì tôi có thể nhìn thấy một thời gian thực hiện cho mỗi câu lệnh INSERT . Nó có nghĩa là mỗi câu lệnh INSERT là một truy vấn tới DB. Tôi đã cập nhật câu hỏi của mình – Mikhail