3

如何使用单例模式创建多个数据库连接?或者也许有更好的方法,共享同一个类但有多个连接?

4

5 回答 5

3

如何使用工厂模式为每个连接返回相同的实例,例如

ConnectionFactory::getInstance(ConnectionFactory::DEVELOPMENT);

返回一个Connection连接到开发数据库的实例。

的实例化Connection只能由 执行ConnectionFactory,它可以将这些实例的引用保存在静态数组中,由连接类型键入。这避免了单例模式,但确保您只维护每个Connection.

于 2009-02-02T09:37:32.880 回答
0

连接池。

在java的情况下:

http://java.sun.com/developer/onlineTraining/Programming/JDCBook/Code/JDCConnectionPool.java

这个例子只是展示了方法,你可以用更好的方式来实现它。

于 2009-02-02T09:37:19.853 回答
0

如果你想要的是多个,那么放弃单例模式怎么样?最近,Singleton 已成为一种反模式,因此即使您需要单个连接,您也应该放弃它。更不用说在 PHP 中扩展 Singleton 目前是相当困难的。

于 2009-02-02T09:39:53.607 回答
0

正如其他人所说,放弃单例,然后,我可能会做这样的事情:

interface Connection_Interface
{
    public function connect();
    public function disconnect();
    public function exec($sql);
    // etc...
}

class Connection implements Connection_Interface
{
    public function __construct($host, $username, $password, $database);
    public function connect();
    public function disconnect();
    public function exec($sql);
    // etc...
}

然后,另一个需要多个连接的类:

class Connection_Multiple implements Connection_Interface
{
    protected $_connections = array();        

    public function __construct();
    public function add(Connection $connection);
    public function connect();
    public function disconnect();
    public function exec($sql)
    {
        // decide here which connection you want to use, then...
        return $connection->exec($sql);
    }
    // etc...
}

由于单个连接和多个连接类都实现了相同的接口,因此您可以以完全相同的方式使用它们。

于 2009-02-02T10:16:53.267 回答
0

我想出了这个解决方案:

class Database {
    private static $instances = array();

    public static function getInstance($connection='default') {
        if (!array_key_exists($connection,self::$instances)) {
            self::$instances[$connection] = new Database($connection);
        }
        return self::$instances[$connection];
    }

    private function __construct($connection) {
        $this->credentials = // getting credentials from config by $connection...
        $this->connect(); // connect using credentials
    }
}

$DB1 = Database::getInstance('development');
$DB2 = Database::getInstance('production');

似乎对我有用。这是单例模式还是混合模式?

于 2009-02-02T12:50:17.483 回答