【问题标题】:Should I ping mysql server before each query?我应该在每次查询之前 ping mysql 服务器吗?
【发布时间】:2011-03-07 10:44:10
【问题描述】:

所以我想知道是否应该 ping mysql 服务器 (mysqli_ping) 以确保服务器在运行查询之前始终处于活动状态?

【问题讨论】:

  • 您真的希望您的数据库服务器经常停机吗?
  • 无法保证服务器在您 ping 和运行查询之间不会停机,因此您仍然需要对查询进行错误处理...为什么要两次?

标签: php mysql ping


【解决方案1】:

您不应该在查询之前 ping MySQL,原因有以下三个:

  1. 当您尝试执行查询时,它不是一种可靠的检查服务器是否会启动的方法,它很可能会在 ping 响应和查询之间的时间内停止。
  2. 即使服务器已启动,您的查询也可能会失败。
  3. 随着网站流量的增加,您将给数据库增加大量额外开销。在使用此方法的企业应用程序中看到大量数据库资源被浪费在 ping 上的情况并不少见。

处理数据库连接的最佳方式是错误处理(try/catch)、重试和事务。

在 MySQL 性能博客上了解更多信息: Checking for a live database connection considered harmful

在那篇博文中,您将看到该 MySQL 实例上 73% 的负载是由应用程序检查数据库是否已启动造成的。

【讨论】:

    【解决方案2】:

    我不这样做。我依赖这样一个事实,即如果服务器消失了,我会遇到连接错误,我会尝试做一些事情。

    执行 ping 可能可以为您节省一点时间,并且看起来对用户的响应速度更快,但快速连接错误并不比等待几秒钟然后出现连接错误好多少.无论哪种方式,用户都无能为力。

    【讨论】:

    • 可能节省您的时间如果服务器关闭,如果没有(希望是 99% 的时间),那么您只能减慢速度,当然可能不会减慢。
    【解决方案3】:

    没有。

    在浏览器中导航之前是否 ping SO,只是为了确保服务器正在运行?

    【讨论】:

      【解决方案4】:

      所以我想知道我是否应该或 不应该 ping mysql 服务器 (mysqli_ping) 以确保 服务器在运行之前始终处于活动状态 查询?

      不是真的。如果它不是实时的,您将通过查询或连接到数据库时出现的错误消息来了解。您可以通过以下方式获取 mysql 错误:

      mysql_error()
      

      示例:

      mysql_connect(......) or die(mysql_error());
      

      【讨论】:

        【解决方案5】:

        这不是标准的处理方式......如果有异常,你会处理它。

        这有点类似于在尝试打开文件之前检查文件是否存在,或者在发生文件未找到异常时捕获它之间的区别......如果这是一个非常非常常见且可能的错误,那么它可能是值得的之前检查它,但通常应该尝试正常执行,并在发生异常时捕获和处理。

        【讨论】:

          【解决方案6】:

          一般来说不会。

          但是,如果您有一个长时间运行的脚本,例如某个称为 cron 作业的后端进程,这可能是连接和后续查询之间的时间跨度,mysqli_ping() 可能有用。

          在这种情况下,在 php.ini 中将 mysqli.reconnect 设置为 true 很有用。

          【讨论】:

            【解决方案7】:

            没有。

            仅仅因为 ping 成功并不意味着查询会成功。如果服务器在您 ping 它和执行查询之间变得不可用怎么办?

            因此,无论如何,您都必须对查询进行适当的错误捕获。 如果你这样做了,你不妨把它作为你的主要错误陷阱。

            添加 ping 只会增加不必要的往返,最终会减慢您的代码速度。

            【讨论】:

              【解决方案8】:

              我唯一能想到的就是如果数据库是
              1. 对您的应用程序的运行不重要,并且,
              2. 有离线倾向。

              除此之外,没有。

              【讨论】:

                【解决方案9】:

                只有在您实现自己的数据库连接池系统时才值得使用 ping。即使在这种情况下,我也不会在每次查询之前执行 ping,而是在每次从池中“连接”/结帐时执行。

                【讨论】:

                  猜你喜欢
                  • 2011-06-01
                  • 1970-01-01
                  • 2018-08-22
                  • 1970-01-01
                  • 2019-06-28
                  • 1970-01-01
                  • 2023-01-02
                  • 1970-01-01
                  • 2019-10-27
                  相关资源
                  最近更新 更多