【问题标题】:Refresh the database connection if connection drops or times out如果连接断开或超时,请刷新数据库连接
【发布时间】:2013-04-26 10:05:35
【问题描述】:

我有一个 Symfony 命令行任务,它有断开 mysql 连接的习惯。

这是一个数据导入任务。它从多个连接中获取数据。它不是一个大查询,而是几个较小的查询。

它似乎在第一次运行时断开了连接。大约一半的脚本。但是第二次运行(从头开始)它总是完成任务。

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

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

[Doctrine\DBAL\DBALException]
SQLSTATE[HY000]: 一般错误: 2013 Lost connection to MySQL server during query

【问题讨论】:

  • 你能告诉我们查询吗?你在使用教义吗?我们在谈论多少行(导入)?
  • 在尝试失败后 MySQL 日志中是否有任何条目?

标签: database symfony database-connection multiple-databases


【解决方案1】:

另一种方法是通过连接中的ping()方法检查Doctrine是否仍然连接到MySQL服务器。如果连接丢失,请关闭活动连接,因为它还没有真正关闭并开始一个新连接。

if(FALSE == $em->getConnection()->ping()){
    $em->getConnection()->close();
    $em->getConnection()->connect();
}

【讨论】:

    【解决方案2】:

    我猜你的意思是如果由于某种原因连接丢失,则连接到数据库。给定一个 EntityManager,你可以这样做:

    $success = $_em->getConnection()->connect();
    

    使用 getConnection,您正在检索学说使用的连接对象 (Doctrine\DBAL\Connection),它公开了 connect 方法。

    您可以随时致电connect,因为它会检查是否已建立连接。如果是这种情况,则返回 false。

    还有一个isConnected 方法来检查是否建立了连接。您可以使用它来查看连接断开的确切位置,以便更清楚地了解正在发生的事情。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-30
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 2015-09-08
    相关资源
    最近更新 更多