多个DB连接类

时间:2009-02-02 09:32:40

标签: php class singleton object

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

5 个答案:

答案 0 :(得分:3)

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

ConnectionFactory::getInstance(ConnectionFactory::DEVELOPMENT);

返回与开发数据库连接的Connection实例。

Connection的实例化只应由ConnectionFactory执行,Connection可以保持对静态数组中这些实例的引用,并由连接类型键入。这样可以避免使用单例模式,但可以确保只维护每个{{1}}的单个实例。

答案 1 :(得分:0)

连接池。

如果是java:

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

这个例子只显示了方法,你可以更好地实现它。

答案 2 :(得分:0)

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

答案 3 :(得分: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...
}

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

答案 4 :(得分: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');

似乎对我有用。这是单身模式还是混合的东西?