Singleton持有多个ADODB连接

时间:2013-02-26 11:26:39

标签: php mysql singleton adodb

传统网站在数据库连接方面表现出意外行为。应用程序连接到同一服务器上的几个MySQL数据库,原始开发人员创建了一个“单例”类,为每个数据库保存连接对象。

最近我们遇到了类的奇怪行为:在创建www后创建与extra的连接时,获取extra的实例会返回一个具有正确性的连接使用var_dump()查看但实际连接到www数据库的参数。

是什么导致这个?代码在某个阶段之前已经起作用了。在每次调用getInstance()时创建一个新连接可以解决问题,但如果可能的话,我想以正确的方式解决这个问题。

<?php

class DBConnection
{
    private static $default;
    private static $extra;
    private static $intra;
    private static $www;

    public static function getInstance($dbname = "default")
    {
        global $db; // This is an array containing database connection parameters

        if(!($dbname == "default" || $dbname == "extra" || $dbname == "www" || $dbname == "intra"))
        {
            $dbname = "default";
        }

        if (empty(self::$$dbname)) // Making this pass every time fixes the problem
        {
            try
            {
                self::$$dbname = ADONewConnection('mysqlt');
                if(isset($db[$dbname]))
                {
                    self::$$dbname->connect(DBHOSTNAME, $db[$dbname]["dbusername"], $db[$dbname]["dbpassword"], $db[$dbname]["dbname"]);
                }
                else 
                {
                    // fallback
                    self::$$dbname->connect(DBHOSTNAME, DBUSERNAME, DBPASSWORD, DBNAME);
                }

                self::$$dbname->SetFetchMode(ADODB_FETCH_ASSOC);
                self::$$dbname->execute("SET NAMES utf8");

                return self::$$dbname;
            }
            catch(Exception $e)
            {
                exit("DB connection failed");
            }
        }
        else
        {
            return self::$$dbname;
        }
    }
}

以下是课堂行为不端的简化示例:

$cn = DBConnection::getInstance("extra");
$cn->debug = true;
$rs = $cn->execute("SELECT * FROM messages WHERE id = ".$this->id);

最后一行失败,并显示错误消息“表www.messages不存在”。

1 个答案:

答案 0 :(得分:0)

1:您不需要在getInstance()中建立连接。 getInstance不能执行任何操作,但返回DB类的实例。

2:当您执行self::$$dbname->connect(时,if (empty(self::$$dbname))会在您下次调用时返回false。

此处描述了Singleton:http://en.wikipedia.org/wiki/Singleton_pattern

你拥有什么 - 它只是一种静态方法。