【问题标题】:How often should I close database connections?我应该多久关闭一次数据库连接?
【发布时间】:2011-01-04 16:58:25
【问题描述】:

目前,我正在我的应用程序初始化中打开一个数据库连接。这是一个相当小的应用程序,如果相关的话,PHP。

我应该连接到数据库,进行调用,然后关闭并为我编写的每个数据库函数重复这个过程吗?

例如,我有以下函数从我的应用程序初始化中获取 $db 变量。

function get_all_sections()
{
    global $db;
    $sql = 'select * from sections'; 

    if (!$db->executeSQL($sql, $result))
    {
        throw new Exception($db->getDatabaseError());
        exit();
    }

    $sections = array();

    for ($i = 0; $i < $db->numberOfRows($result); $i++)
    {
        $sections[] = new Section($db->fetchArray($result, MYSQLI_ASSOC));
    }

    return $sections;
}

如果我打开连接然后在获取行后关闭它会更好吗?似乎有很多连接被打开和关闭。

【问题讨论】:

  • 你在使用连接池吗?

标签: php mysql database optimization


【解决方案1】:

最简单的解决方案是使用 mysql_pconnect() - see here

这样,如果连接已经打开,它将使用它而不是创建一个新连接。如果不是,它将再次连接

【讨论】:

  • 如果你在达到限制时不关闭它,我相信你会收到too many clients already 错误。这是我的想法,但如果我错了,请纠正我。
【解决方案2】:

由于 PHP MySQL 连接是相当轻量级的,您可能可以在需要时打开和关闭连接。其他数据库连接则不然,比如连接到 SQL Server,它的连接量相当大。

然而,在所有情况下,就可维护性/逻辑/依赖性而言,做最有意义的事情。然后,如果您发现自己感觉到明显的减速,您可以优化那些需要加速的区域。

如有疑问,请遵循黄金法则:不要过早优化。

【讨论】:

    【解决方案3】:

    使用mysql_pconnect 进行连接池,并在每个操作结束时关闭。线程不会真正关闭,线程将被重新使用。这样既安全又高效。

    【讨论】:

      【解决方案4】:

      连接到数据库需要有限的时间。当通过域套接字或命名管道连接时,它可以忽略不计,但如果通过网络连接,或者更糟糕的是,通过开放的 Internet,它可能会大得多。至少在请求的整个生命周期内保持连接。

      【讨论】:

        【解决方案5】:

        如果您在 (http://en.wikipedia.org/wiki/Connection_pool) 上有连接池,则可以在需要时获取新连接。但是,我会说要养成将任何资源视为“有限”的习惯,并且如果您打开数据库句柄,请尽可能长时间地保留它。

        【讨论】:

        • 我总是听到另一种建议:总是尽快关闭你的数据库连接
        猜你喜欢
        • 2011-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-08
        • 2011-08-01
        • 2020-12-31
        相关资源
        最近更新 更多