【问题标题】:Doctrine2 Batch InsertDoctrine2 批量插入
【发布时间】:2012-08-22 15:10:49
【问题描述】:

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

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

主要内容:

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

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

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

【问题讨论】:

    标签: symfony doctrine-orm


    【解决方案1】:

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

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

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

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

    最好的问候, 克里斯托夫

    【讨论】:

    • 感谢您的回复,但我不确定only one query to the database per "flush" call,因为我可以看到每个 INSERT 语句的执行时间。这意味着每个 INSERT 语句都是对 DB 的一次查询。我更新了我的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2012-02-16
    • 2023-04-09
    • 2020-10-24
    • 2015-03-31
    • 2012-05-10
    相关资源
    最近更新 更多