【问题标题】:PHP Database connection practicePHP数据库连接实践
【发布时间】:2011-02-03 09:01:48
【问题描述】:

我有一个连接到多个数据库(Oracle、MySQL 和 MSSQL)的脚本,每次脚本运行时可能不会使用每个数据库连接,但都可以在单个脚本执行中使用。我的问题是,“最好在脚本开头连接一次所有数据库,即使所有连接都可能不使用。还是根据需要连接到它们更好,唯一的问题是我需要在循环中进行连接调用(因此数据库连接在循环中 X 次是新的)。

是的示例代码 #1:

// Connections at the beginning of the script
$dbh_oracle = connect2db();
$dbh_mysql  = connect2db();
$dbh_mssql  = connect2db();

for ($i=1; $i<=5; $i++) {
   // NOTE: might not use all the connections
   $rs = queryDb($query,$dbh_*); // $dbh can be any of the 3 connections
}

是的示例代码 #2:

// Connections in the loop
for ($i=1; $i<=5; $i++) {
   // NOTE: Would use all the connections but connecting multiple times
   $dbh_oracle = connect2db();
   $dbh_mysql  = connect2db();
   $dbh_mssql  = connect2db();

   $rs_oracle = queryDb($query,$dbh_oracle);
   $rs_mysql  = queryDb($query,$dbh_mysql);
   $rs_mssql  = queryDb($query,$dbh_mssql);
}

现在我知道您可以使用持久连接,但是对于循环中的每个数据库也都打开一个连接吗?比如mysql_pconnect()mssql_pconnect()adodb for Oracle persistent connection method。我知道持久连接也可能会占用资源,因为我正在寻找最佳性能/实践。

这是why persistent connections could cause problems上的好帖子

【问题讨论】:

    标签: php loops persistence database-connection


    【解决方案1】:

    使用惰性连接包装类:

    class Connection
    {
        private $pdo;
        private $dsn;
    
        public __construct($dsn)
        {
            $this->dsn = $dsn;
        }
    
        public query($sql)
        {
            //the connection will get established here if it hasn't been already
            if (is_null($this->pdo))
                $this->pdo = new PDO($this->dsn);
    
            //use pdo to do a query here
    
        }
    }
    

    我希望您已经在使用 PDO。如果不是,你应该是。 PDO 独立于数据库。如果您使用过程函数执行此操作,则必须为每种数据库类型创建一个新类。

    无论如何,这只是一个骨架(例如,您想在query() 中添加一个$params 选项),但您应该能够理解。仅当您调用 query() 时才会尝试连接。构造对象不会建立连接。

    顺便说一句,考虑使用Doctrine。它具有惰性连接,总体上让生活更轻松。

    【讨论】:

    • 我喜欢这种方法,我创建了一个类似的类来使用 XML 配置和通用连接和查询类,使用类型 (mysql,mssql,oracle) 来定义连接/查询功能.
    • @Phill 如果您使用 PDO,您甚至不需要这样做,无论您连接到什么数据库,它都可以工作,而无需更改代码。
    • 将不得不检查 PDO,然后再次检查
    • @ryeguy 例如,我将如何在模型类中使用它?用二传手(通过DI)做吗? myclass (){ public function setConn....}
    【解决方案2】:

    最佳性能/实践规则很简单:只连接到一个数据库。

    至于连接 - 尝试实现一些数据库访问类。可以按需自动连接。

    【讨论】:

    • +1 如果您不知道是否需要特定连接,请使用只有在使用时才会激活的惰性连接。
    • 延迟连接?没听说过,能不能提供一个好的资源?谷歌搜索也是如此。谢谢
    猜你喜欢
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 2020-05-05
    • 2018-08-23
    • 1970-01-01
    • 2010-12-15
    相关资源
    最近更新 更多