【问题标题】:Doctrine query execution memory issue教义查询执行内存问题
【发布时间】:2015-04-03 17:01:10
【问题描述】:

我正在循环运行一个原则查询,绑定参数并执行多次。查询执行得很好,问题是每组循环的内存使用量增加了大约 3mb。垃圾收集似乎没有启动,最终服务器内存不足。

foreach () { .....
    foreach () { .....
        $conn = $this->getEntityManager()->getConnection();

        if ($this->sql == null) {
            $this->sql = $conn->prepare(
                "INSERT INTO table (l_id, a_id) VALUES (:lId, :aId);"
            );
        }
        //Memory usage 200
        foreach($lo as $l) {
            $this->sql->bindParam('lId', $l->getId());
            $this->sql->bindParam('aId', $aId);
            $this->sql->execute();
        }
        //Memory usage ++3mb
    }
}

整个脚本也嵌套在一个循环中。所以它会被调用很多次。但是上面的foreach循环似乎是内存增加的地方。

我正在调用对数据库的直接插入,因此实体管理器甚至没有使用,因为最初我认为这可能会减慢它的速度。

编辑: 我尝试将 bindParam 更改为 bindValue 但出现同样的问题。并将第二个 bindParam 移到循环外;

【问题讨论】:

  • 你用的是什么数据库引擎?
  • @TomaszMadeyski PostgreSQL
  • 我不确定它在 postgresql 上的工作原理,但请尝试在每个 $sql->execute() 之后调用 $sql->closeCursor()
  • @TomaszMadeyski 内存还在攀升,但我正在等待垃圾收集是否启动
  • 确保禁用查询日志记录和查询分析,请参阅this希望对您有所帮助

标签: php postgresql symfony memory-leaks doctrine-orm


【解决方案1】:

通过在学说中关闭 SQL 日志记录,考虑到在此应用程序中触发的查询数量,内存泄漏问题得到了解决,

$conn = $this->getEntityManager()->getConnection();
$conn->getConfiguration()->setSQLLogger(null);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多