【问题标题】:Efficient way to connect to a database when multiple functions are running queries当多个函数正在运行查询时连接到数据库的有效方法
【发布时间】:2013-08-16 01:26:33
【问题描述】:

我正在编写一个应用程序,它有一个 functions.php 文件,一个 javascript 文件正在通过 Ajax 访问该文件。目前我有每个函数连接到数据库,运行查询,然后关闭数据库。我知道必须有一种更有效的方法来做到这一点。我只想输入一次数据库凭据,然后让所有功能都使用它。最有效的方法是什么?我已经阅读了很多关于这个主题的答案,但它们都是不同的,我迷路了。请指出我正确的方向:)

目前我的函数是这样打开数据库的。

$db = new mysqli("hostname", "username", "password");
$db -> select_db("database name");

或者像这样

mysql_connect("hostname", "username", "password");
mysql_select_db('database name') or die( "Unable to select database");

【问题讨论】:

    标签: mysql database database-connection


    【解决方案1】:

    简单的答案是连接池。连接池是始终连接到数据库的连接池。您可以为连接数设置高水位线和低水位线。

    当您的应用程序从池中请求连接时,它将使用其中一个空闲连接并重用它。这就是您扩展数据库连接的方式。

    您正在使用 PHP,请查看以下内容:

    1. http://www.oracle.com/technetwork/topics/php/php-scalability-ha-twp-128842.pdf
    2. http://php.net/manual/en/mysqlnd-ms.pooling.php

    网上有很多关于这方面的信息。

    【讨论】:

    • 那么您的意思是使用连接池有助于降低服务器/数据库的负载?
    • 连接池是扩展数据库连接的方法。我在非洲经营了一个拥有超过 10 000 000 名用户的网站。我们在高峰期有 350 000 000 个并发连接,除非我们使用连接池,否则我们将无法处理它。
    【解决方案2】:

    您可以检查数据库连接变量是否已经设置:

    if (!isset($db)) {
        $db = new mysqli(...);
        $db->select_db("database_name");
    }
    

    mysql_connect 类似(它返回一个连接资源,因此您可以将它分配给一个变量,即使它是其他函数的可选参数)。

    另一种方法是使用带有静态变量的函数:

    function connect_db() {
        static $db = new mysqli(...);
        static $selected = $db->select_db("database_name");
        return $db;
    }
    

    第三种选择是在脚本开始时连接到数据库一次,而不是在每个函数中。然后将$db 传递给每个函数,或者使用global $db; 访问它。

    【讨论】:

    • 但我不想在每个函数中重复代码。这可能吗?
    • 把它放在一个函数中,让你的所有其他函数调用它。
    • 在每个函数中使用$database = new PDO()然后global $database怎么样?
    • 这和我的第三个选项一样,不是吗?
    • 是的,对不起!好的最后一个问题。使用此方法时,我需要在每个函数的末尾或文件末尾或根本关闭数据库吗?
    猜你喜欢
    • 2018-07-17
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多