【发布时间】:2016-04-09 10:07:18
【问题描述】:
我想从 XML 文件中批量导入 Doctrine 实体。
XML 文件可能非常大(最多 100 万个实体),因此我无法以传统方式持久化所有实体:
$em->beginTransaction();
while ($entity = $xmlReader->readNextEntity()) {
$em->persist($entity);
}
$em->flush();
$em->commit();
我很快就会超过我的内存限制,而 Doctrine 并不是真正设计用于处理那么多托管实体。
我不需要跟踪对持久化实体的更改,只是为了持久化它们;因此我不希望它们由 EntityManager 管理。
是否可以在不由 EntityManager 管理的情况下保留实体?
我想到的第一个选项是在持久化后立即将其分离:
$em->beginTransaction();
while ($entity = $xmlReader->readNextEntity()) {
$em->persist($entity);
$em->flush($entity);
$em->detach($entity);
}
$em->commit();
但这在 Doctrine 中相当昂贵,并且会减慢导入速度。
另一种选择是使用Connection 对象和准备好的语句直接将数据插入数据库,但我喜欢实体的抽象,理想情况下希望存储对象直接。
【问题讨论】:
标签: doctrine-orm