刷新失败后恢复Doctrine连接

时间:2017-02-08 15:08:33

标签: php symfony doctrine-orm doctrine symfony-2.8

当entityManager执行flush时,此flush会抛出异常。理论实体管理器将捕获此异常,清除工作单元并将mark the connection关闭,然后执行回滚(https://github.com/doctrine/doctrine2/blob/v2.5.6/lib/Doctrine/ORM/UnitOfWork.php#L412-L417)。

我需要恢复连接,但由于在entityManager中没有使用$this->closed = false的方法,我很困惑如何解决这个错误flush之后我可以flush另一个实体标记为在数据库中将特定任务标记为失败!此外,当前一个失败时,我无法运行多个任务,而当使用entityManager时,另一个无法运行。

TL; DR 那么在刷新失败后恢复连接的最佳做法是什么?我看到它只是标记为已关闭并仍然连接但我不想使用像Reflection或自定义实体管理器这样的东西来恢复我的连接。

2 个答案:

答案 0 :(得分:3)

您可以使用功能resetManager赞这个$this->getDoctrine()->resetManager()
link

中的更多细节

<强> 修改

让我们假设它的一个表有一个日期字段As DateTime而不是null

    $Exemple = new Exemple();
    $Exemple->setDate(null);
    $em = $this->getDoctrine()->getManager();
    try {
        $em->persist($Exemple);
        $em->flush();
    } catch (\Exception $ex) {
        $em = $this->getDoctrine()->resetManager();
    }
    $Exemple->setDate(new \DateTime());
    $em->persist($Exemple);
    $em->flush();

$this->getDoctrine()->resetManager();数据刷入数据库中 如果没有$this->getDoctrine()->resetManager();,我们会 EntityManager已关闭

答案 1 :(得分:1)

试试这个,首先,如果它抛出异常,请抓住你的方法,之后,你可以检查连接是否仍然打开,否则,重新定义它。

void Book::setAuthor( std::shared_ptr<Author> t_author)
{
   m_author = std::move( t_author );
}

我在使用Symfony2.8的命令中使用了这种方式,它对我来说很正常。