簡體   English   中英

教義-使用namedQuery執行時發生內存泄漏?

[英]Doctrine - memory leak with namedQuery execution?

我正在為我的項目使用symfony 3.4和教義。 在我為用戶生成排名的命令之一中,使用namedQuery時遇到了潛在的內存泄漏(盡管我可能錯了)。

在每個循環迭代中(超過2000條記錄),我都在運行EntityManager->clear()方法以及gc_collect_cycles() (只是為了確保正確的垃圾收集)。 盡管僅10000次迭代后的內存使用量就躍升到500mB左右,但這確實很奇怪,因為它在使用queryBuilder構成查詢的其他命令中可以正常工作。

我確保沒有其他代碼對此內存問題負責,並將執行提取為僅獲取結果並運行命名查詢。

我也嘗試在實體管理器配置中禁用sql logger,但這無濟於事。 任何人都知道有什么問題嗎?

NamedQuery

SELECT SUM(a.points) FROM __CLASS__ a WHERE a.user = :user GROUP BY a.user

代碼的問題部分(最大約500MB):

$query = $this->createNamedQuery('count_points');
$query->setParameter('user', $user->getId());
$query->setCacheable(false);

return $query->getSingleScalarResult();

無內存泄漏的解決方案(最大〜60-70MB):

$query = $this->createNamedQuery('count_points');
$query->setParameter('user', $user->getId());
$query->setCacheable(false);

// bypass named query execution through doctrine for memory saving
$sql = $query->getSQL();
$conn = $this->getEntityManager()->getConnection();
$stmt = $conn->prepare($sql);
$stmt->execute([$user->getId()]);
unset($query);

return (int)$stmt->fetch(\PDO::FETCH_COLUMN);

我在與$query->getSingleScalarResult()關聯時遇到內存問題。

如果我交換return $query->getSingleScalarResult(); 通過

$r = return $query->getResult();
return $r[0]['mysum'];

泄漏消失了。 您必須稍微更改查詢並為結果命名:

SELECT SUM(a.points) AS mysum FROM __CLASS__ a WHERE a.user = :user GROUP BY a.user

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM