如果连接断开或超时,请刷新数据库连接

Rob*_*_UK 12 database database-connection multiple-databases symfony

我有一个Symfony命令行任务,习惯于删除mysql连接.

它是一个数据导入任务.从多个连接中获取数据.它不是一个大问题,而是一些较小的查询.

它似乎在第一次运行时丢弃连接.大约一半的脚本.然而,它第二次运行(从头开始)它总是完成任务.

它没有超时查询,因为我得到的错误响应是连接已被删除,它自己运行正常.因此,我认为它的某种超时问题是由于查询缓存加速脚本而第二次运行时避免的.

所以我的问题是如何刷新数据库连接?

[Doctrine\DBAL\DBALException]
SQLSTATE [HY000]:常规错误:2013查询期间与MySQL服务器的连接丢失

Ler*_*roy 15

另一种方法是通过ping()连接中的方法检查doctrine是否仍然连接到mysql服务器.如果连接丢失,请关闭活动连接,因为它尚未真正关闭并启动新连接.

if(FALSE == $em->getConnection()->ping()){
    $em->getConnection()->close();
    $em->getConnection()->connect();
}
Run Code Online (Sandbox Code Playgroud)


Sgo*_*kes 9

我猜你的意思是如果由于某种原因连接丢失,就连接到数据库.给定EntityManager,您可以通过以下方式执行此操作:

$success = $_em->getConnection()->connect();
Run Code Online (Sandbox Code Playgroud)

getConnection,您正在检索连接对象doctrine uses(Doctrine\DBAL\Connection),它公开了该connect方法.

您可以connect随时拨打电话,因为它检查已建立连接.如果是这种情况,则返回false.

还有isConnected一种检查建立连接的方法.您可以使用它来查看连接的确切位置,以便更清楚地了解正在发生的情况.

  • 它不起作用.当连接丢失已经连接的实体管理器时,会导致没有监听器.工作解决方案是http://stackoverflow.com/questions/15362070/zf2-doctrine2-server-has-gone-away-how-to-jog-an-old-connection (2认同)