2

よろしくお願いします。

エンティティリポジトリが停止している場合に再接続をジョギングするためにエンティティリポジトリで呼び出す関数を誰かがすぐに知っているのではないかと思います。ZF2 CLIルートを介してwait_timeoutを超える時間がかかる可能性のあるいくつかのジョブを実行していますが、残念ながら、ERの接続は使用する必要がある時間(ジョブが完了すると)までに切断されます。

必要:

// do the long job

$sl = $this->getServiceLocator();
$mapper = $sl->get( 'doctrine_object_mapper' );
if( !$mapper->getRepository()->isAlive() ) // something like so
    $mapper->getRepository()->wakeTheHellUp();

それらの適切なメソッド名ではありません!;)

再度、感謝します。

4

1 に答える 1

5

これは、実行時間の長いプロセスと接続でよくある問題です。

解決策は、ORM のDBAL 接続を取得し、接続が失われた場合に再作成することです (トランザクション中に切断されないようにします)。これは明らかに面倒ですが、今のところこれが唯一の方法です。

// note - you need a ServiceManager here, not just a generic service locator
$entityMAnager = $serviceManager->get('entity_manager');
$connection    = $entityManager->getConnection();

try {
    // dummy query
    $connection->query('SELECT 1');
} catch (\Doctrine\DBAL\DBALException $e) {
    if ($connection->getTransactionIsolation()) {
        // failed in the middle of a transaction - this is serious!
        throw $e;
    }

    // force instantiation of a new entity manager
    $entityManager = $serviceManager->create('entity_manager');
}

$this->doFoo($entityManager);
于 2013-03-12T23:11:24.653 に答える