相关疑难解决方法(0)

doctrine2 - 如何提高冲洗效率?

我必须更新我的Doctrine实体以匹配(potentionaly very large)XML文件中的记录.我还必须根据XML中的数据更新ManyToMany关联.这就是我在循环中所做的事情:

  1. 从XML获取数据
  2. 从DB获取实体(如果不存在则创建新)
  3. 设置新的实体属性
  4. 获取当前实体关联(getter返回ArrayCollection对象)
  5. 清除所有关联(通过调用ArrayCollection::clear())
  6. 设置新关联(通过ArrayCollection::add()在子循环中调用)
  7. 由EntityManager持久化实体

循环我叫EntityManager::flush().

问题是刷新会生成大量查询,而不是一次更新/插入/删除多行.对于每个实体在查询后执行:

  • SELECT从DB获取实体
  • UPDATE更新实体属性(现在实际上已跳过,因为没有更改属性...)
  • 删除以清除以前的关联
  • INSERT以插入新关联

所以总共有305条记录在XML中我得到了915个查询(我想如果所有实体都会改变,它可能会达到1220个查询),这使得导入非常慢.

我可以在循环之前利用IdentityMap和预取实体,但仍然存在UPDATE/DELETE/INSERT查询.

  • 有没有办法让flush方法更好地优化查询(使用多插入,WHERE IN而不是多个DELETE查询等)?
  • 这是冲洗方法的正常行为还是我做错了什么?
  • 也许我更新实体关联的方式存在问题.有更好的方法如何做到这一点?(而不是"获取/清除/添加"方法)
  • 我知道Doctrine并不适用于大规模的betch处理,但我认为将它用于XML导入是避免DB不一致的最佳方法,这种不一致可能会出现在非ORM方法中.是对的吗?
  • 如果上面的方法是错误的,我应该如何解决问题?

php mysql doctrine-orm

13
推荐指数
2
解决办法
1万
查看次数

原则2:批处理插入引用其他实体的实体时的奇怪行为

我正在尝试这里描述的批处理方法:http: //docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/batch-processing.html

我的代码看起来像这样

    $limit = 10000;
    $batchSize = 20;
    $role = $this->em->getRepository('userRole')->find(1);
    for($i = 0; $i <= $limit; $i++)
    {
        $user = new \Entity\User;
        $user->setName('name'.$i);
        $user->setEmail('email'.$i.'@email.blah');
        $user->setPassword('pwd'.$i);
        $user->setRole($role);
        $this->em->persist($user);
         if (($i % $batchSize) == 0) {
             $this->em->flush();
             $this->em->clear();
        }
    }
Run Code Online (Sandbox Code Playgroud)

问题是,在第一次调用em-> flush()之后,$ role也会被分离,并且每20个用户创建一个带有新id的新角色,这不是我想要的

这种情况有没有可用的解决方法?只有一个我可以做的工作是每次在循环中获取用户角色实体

谢谢

php bulkinsert doctrine-orm

6
推荐指数
1
解决办法
2634
查看次数

标签 统计

doctrine-orm ×2

php ×2

bulkinsert ×1

mysql ×1