Doctrine2 批量插入

6
能否使用单个查询向数据库插入多个实体? 当我按照这里的示例(链接)执行时,我可以在Web Debugger中看到多个查询。
更新日期:23.08.2012
我找到了以下相关链接,希望能帮助有人理解批处理:
  1. http://www.doctrine-project.org/blog/doctrine2-batch-processing.html
  2. doctrine2 - 如何提高flush效率?
  3. Doctrine 2:在批处理时插入引用其他实体的实体时出现奇怪的行为
主要内容:

一些人可能会想为什么Doctrine不使用多插入(insert into (...) values (...), (...), (...), ...

首先,此语法仅受mysql和新版postgresql支持。其次,在使用AUTO_INCREMENT或SERIAL且ORM需要标识符以管理对象身份时,很难获得此类多插入中生成的所有标识符。最后,插入性能很少是ORM的瓶颈。对于大多数情况来说,正常插入已足够快,如果你真的想进行快速批量插入,那么多插入不是最好的方式,即Postgres COPY或Mysql LOAD DATA INFILE速度要快几个数量级。

这些就是为什么在ORM中实现在mysql和postgresql上执行多次插入的抽象不值得付出努力的原因。希望这可以解答一些疑问。

1个回答

0

我认为会有几个插入语句,但每个"flush"调用只会向数据库发送一个查询。

正如在这里提到的http://doctrine-orm.readthedocs.org/en/2.0.x/reference/working-with-objects.html

每次"persist"都会向当前UnitOfWork添加一个操作,然后是对EntityManager#flush()的调用,它将实际写入数据库(封装所有UnitOfWork操作在单个事务中)。

但我还没有检查上述行为是否是实际行为。

此致, Christophe


谢谢您的回复,但我不确定“每个'flush'调用只有一个查询到数据库”,因为我可以看到每个INSERT语句的执行时间。这意味着每个INSERT语句都是对DB的一个查询。我更新了我的问题。 - Mikhail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接