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 回答