2012-08-22 77 views
5

是否有可能通過單個查詢插入多個實體到數據庫? 當我使用here一個例子,我可以看到幾個查詢,在Web調試Doctrine2批插入

已更新2012年8月23日

我發現下面的相關鏈接。我希望這將有助於別人瞭解批處理:

  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

主要的事情:

有些人似乎很奇怪爲什麼學說不使用 多插入(insert into(...) (...),(...),(...),...

首先,該語法只支持mysql和更新的postgresql版本。其次,當使用 AUTO_INCREMENT或SERIAL時,並沒有簡單的方法來獲得所有生成的標識符在這樣的多插入中,並且ORM需要標識符來管理對象的身份 。最後,插入性能很少是ORM的瓶頸。正常的插入對於大多數情況來說足夠快,如果你真的想做快速的大容量插入,那麼多重插入不是最好的方式,即Postgres COPY或Mysql LOAD DATA INFILE快幾個數量級。

這些是爲什麼不值得努力實現在ORM中執行在mysql和postgresql上執行多重插入的抽象的原因。 我希望清除一些問號。

回答

0

我認爲會有幾個插入語句,但是每個「flush」調用對數據庫只有一個查詢。

如此地 http://doctrine-orm.readthedocs.org/en/2.0.x/reference/working-with-objects.html

每一個「堅持」將添加一個操作到當前的UnitOfWork,那麼調用的EntityManager#的flush()將實際寫入數據庫(封裝的所有操作單一事務中的UnitOfWork)。

但我沒有檢查我上面描述的行爲是否是實際行爲。

最好的問候, 克里斯托夫

+0

感謝您的答覆,但我不知道,'只有一個查詢每「刷新」 call'數據庫,因爲我可以看到執行的時間爲每個INSERT語句。這意味着每個INSERT語句都是對數據庫的一個查詢。我更新了我的問題 – Mikhail