5

是否可以通过单个查询将多个实体插入数据库?当我使用此处的示例时,我可以在 Web 调试器中看到几个查询

2012 年 8 月 23 日更新

我找到了以下相关链接。我希望它有助于某人理解批处理:

  1. http://www.doctrine-project.org/blog/doctrine2-batch-processing.html
  2. 学说2 - 如何提高冲洗效率?
  3. 原则 2:批量处理引用其他实体的实体插入时的奇怪行为

主要的事情:

有些人似乎想知道为什么 Doctrine 不使用多重插入(insert into (...) values (...), (...), (...), ...

首先,这种语法仅在 mysql 和更新的 postgresql 版本上受支持。其次,当使用 AUTO_INCREMENT 或 SERIAL 时,没有简单的方法可以在这样的多插入中获取所有生成的标识符,并且 ORM 需要标识符来进行对象的身份管理。最后,插入性能很少是 ORM 的瓶颈。普通插入对于大多数情况来说已经足够快了,如果你真的想做快速批量插入,那么多插入无论如何都不是最好的方法,即 Postgres COPY 或 Mysql LOAD DATA INFILE 快几个数量级。

这就是为什么不值得努力在 ORM 中实现对 mysql 和 postgresql 执行多插入的抽象的原因。我希望这可以消除一些问号。

4

1 回答 1

0

我认为会有几个插入语句,但每次“刷新”调用只有一个对数据库的查询。

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

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

但是我没有检查我上面描述的行为是实际行为。

最好的问候,克里斯托夫

于 2012-08-22T19:51:34.250 回答