我在symfony2和doctrine2的结合上遇到了很多麻烦。我必须处理巨大的数据集(大约 2-3 百万次写入和读取),并且必须做大量额外的工作以避免内存不足。
我找出了两个要点,即“泄漏”内存(它们实际上并不是真正泄漏,而是分配了很多内存)。
Entitymanager 实体存储(我不知道这个的真实名称)似乎保留了所有已处理的实体,您必须定期清除此存储
$entityManager->clear()
Doctrine QueryCache - 它缓存所有使用过的查询,我发现的唯一配置是,您可以决定要使用哪种类型的缓存。我没有找到全局禁用,也没有找到每个查询禁用它的有用标志。 所以通常我使用该函数为每个查询对象禁用它
$qb = $repository->createQueryBuilder($a); $query = $qb->getQuery(); $query->useQueryCache(false); $query->execute();
所以..这就是我现在想到的.. 我的问题是:
是否有一种简单的方法可以拒绝 Entitymanagerstorage 中的某些对象? 有没有办法在实体管理器中设置查询缓存的使用? 我可以在 Symfony/doctrine 配置中的某个位置配置此缓存行为吗?
如果有人给我一些好的建议,那就太酷了..否则这可能会帮助一些新手..
青
最佳答案
正如Doctrine Configuration Reference所述默认情况下,SQL 连接的日志记录设置为kernel.debug的值,因此,如果您实例化了 AppKernel,并将 debug 设置为true每次迭代的 SQL 命令都会存储在内存中。
您应该将 AppKernel 实例化为 false,在配置 YML 中将 logging 设置为 false,或者在之前手动将 SQLLogger 设置为 null使用EntityManager
$em->getConnection()->getConfiguration()->setSQLLogger(null);
关于orm - 内存泄漏 Symfony2 Doctrine2/超出内存限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9699185/