orm - 内存泄漏 Symfony2 Doctrine2/超出内存限制

标签 orm memory-leaks symfony doctrine-orm

我在symfony2和doctrine2的结合上遇到了很多麻烦。我必须处理巨大的数据集(大约 2-3 百万次写入和读取),并且必须做大量额外的工作以避免内存不足。

我找出了两个要点,即“泄漏”内存(它们实际上并不是真正泄漏,而是分配了很多内存)。

  1. Entitymanager 实体存储(我不知道这个的真实名称)似乎保留了所有已处理的实体,您必须定期清除此存储

    $entityManager->clear()
  2. 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/

相关文章:

Symfony2 bundle 具有相同的路由

orm - 有关于小巧 Dapper 文件吗?

go - 在整洁的架构设置中使用 gorm 时是否需要持久性模型?

java - Hibernate基于 View 的复合键

c++ - 如何在 visual studio 的所有 cpp 文件中自动包含标题?

java - 使用 TensorFlow for Java 的内存泄漏

iphone - 追踪 cocoa 内存泄漏

php - 从 doctrine 中的表中检索所有行

java - 在 Hibernate 中声明 POJO 的最佳实践

php - 有关安全环境中用户的最佳实践/操作指南