2011-10-08 13 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; 
} 

最初にEntity Managerを再作成した理由は、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

実際には、閉じるのではなくクリアメソッドを使用しましたか?

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

私はこれがクリアされていないSQLロガーをオフにすることを読んで、時にはなどのメモリリークを生成します。

私は

+0

@Cristian_Douce私が質問で言ったように、私は再作成の代わりにクリアを使用した後、私のメモリリークの問題は解決されました。しかし、私はemの作成と破壊を必要とするスクリプトの他の部分があるので、問題はまだ有効です。 –

+0

そして、それを閉じる前に消していくのはどうですか? –

+0

@Cristian_Douce私はそれを閉じる前にそれをクリアしています。そして、私はクローズ機能のために教義のコードを読んできました。 emへの参照を保持する静的属性または永続オブジェクトのいずれかが存在する必要があります。ガベージコレクタがそれを解放していない場合は、そのオブジェクトを参照します。 –

9

Batch Processingは、あなたがしようとした持っている> ---これがあなたの役に立てば幸いあなたは経験している。

+1

それは1つです! – Burgi

関連する問題