Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to correctly close an Entity Manager in doctrine

I was having a memory leak problem in a Doctrine2 script that was aparently caused by a piece of code that was supposed to eliminate memory problems.

Before I knew you could (and should) clear the Entity Manager, every 20 iterations i did the following:

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

And the Bootstrap::createEm looks like this:

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

The reason that I recreated the Entity Manager in the first place was because my UnitOfWork was growing wild and I didn't know about the $em->clear() method.

So, even if my current memory leak seems solved at the moment (or at least reduced), i still have to create a new Entity Manager whenever I need to do a separate insert/update query without relying that someone else do the flush. For example, whenever I send an email, I insert a row in the database to indicate so, and the code looks like this:

    $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();

From what I've learned from before, that leaves some memory leaked behind.

So my question is, what am I doing wrong here? why is this leaking memory and how should I really close/recreate an entity manager?

like image 452
Hernan Rajchert Avatar asked Oct 08 '11 02:10

Hernan Rajchert


1 Answers

Have you tried:

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

I've read that this turns off the SQL Logger which is not cleared and sometimes produces memory leaks like you are experiencing.

like image 192
Cristian Douce Avatar answered Sep 23 '22 14:09

Cristian Douce