2011-10-08 107 views
7

我在Doctrine2脚本中遇到了内存泄漏问题,这个问题原本是由一段应该消除内存问题的代码造成的。如何在doctrine中正确关闭实体管理器

我知道之前,你可以(也应该)清除实体管理器,每20次迭代我做了以下内容:

if ($this->usersCalculated % 20 == 0) { 
    $this->em->close(); 
    $this->em = \Bootstrap::createEm(); 
    $this->loadRepositories(); 
} 

和自举:: createEm看起来是这样的:

public static function createEm() { 
    $em = EntityManager::create(Bootstrap::$connectionOptions, Bootstrap::$config); 
    $em->getConnection()->setCharset('utf8'); 
    return $em; 
} 

我首先重新创建实体管理器的原因是因为我的UnitOfWork变得疯狂,我不知道$ em-> clear()方法。因此,即使我目前的内存泄漏似乎在目前解决(或至少减少),我仍然必须创建一个新的实体管理器,每当我需要做一个单独的插入/更新查询而不依赖于别人做冲洗。例如,每当我发邮件,我在数据库中插入一行来表示的话,并且代码看起来是这样的:

$emailSent = new \model\EmailSent(); 
    $emailSent->setStuff(); 
    // I do it in a new em to not affect whatever currentunit was doing. 
    $newEm = \Bootstrap::createEm(); 
    $newEm->persist($emailSent); 
    $newEm->flush(); 
    $newEm->close(); 

从我从以前学过,留下一些内存泄露的背后。

所以我的问题是,我在这里做错了什么?为什么这是泄漏的内存,我应该如何真正关闭/重新创建一个实体管理器?

回答

2

您是否尝试过使用clear方法而不是close?

我希望这有助于你--->Batch Processing

+0

@Cristian_Douce正如我在问题中所说,我的内存泄漏问题是在我使用clear而不是重新创建后解决的。但是这个问题仍然有效,因为我有其他需要创建和销毁时间的脚本部分。 –

+0

关闭它之前要清除什么? –

+0

@Cristian_Douce我正在清理它,然后关闭它。我已经阅读关闭函数的学说代码,它所做的只是调用清除并将其标记为关闭。必须有一些静态属性或持久对象持有对em的引用,否则垃圾回收器将释放它。 –

9

你试过:

$this->em->getConnection()->getConfiguration()->setSQLLogger(null); 

我读过,这将关闭SQL记录仪未清除,有时会产生内存泄漏像你正在经历。

+1

就是这个! – Burgi