守护程序中的 Doctrine2 连接超时

2022-08-30 20:22:35

我有一个长时间运行的守护进程(Symfony2 Command),它可以从Redis中的工作队列中获取工作,并使用orm执行这些作业并写入数据库。

我注意到,当工作人员闲置等待工作时,由于与MySQL的连接超时,工作人员有死亡的趋势。

具体来说,我在日志中看到了这一点:MySQL服务器已经消失了。

无论如何,我可以让教义自动重新连接吗?或者有没有办法手动捕获异常并重新连接学说orm?

谢谢


答案 1

我在我的symfony2 beanstalkd守护进程命令工作线程中使用它:

$em = $this->getContainer()->get('doctrine')->getManager();
if ($em->getConnection()->ping() === false) {
    $em->getConnection()->close();
    $em->getConnection()->connect();
}

答案 2

看起来,每当 EntityManager 在 Doctrine 中遇到任何错误/异常时,连接就会关闭,EntityManager 就会失效。

由于通常所有内容都包装在事务中,并且该事务在调用$entityManager->flush()时执行,因此您可以尝试捕获异常并尝试重新执行或放弃。

您可能希望检查异常的确切性质,并对类型(无论是 PDOException 还是其他类型)进行更具体的捕获。

对于MySQL已消失的异常,您可以尝试通过重置EntityManager来重新连接。

$managerRegistry = $this->getContainer()->get('doctrine');
$em = $managerRegistry->getEntityManager();
$managerRegistry->resetEntityManager();

这应该使$em再次可用。请注意,您必须再次重新保留所有内容,因为此$em是新的。


推荐