Класс соединения с несколькими БД - PullRequest
3 голосов
/ 02 февраля 2009

Как создать несколько соединений с БД, используя шаблон Singleton? Или, может быть, есть лучший подход - использовать один и тот же класс, но несколько соединений?

Ответы [ 5 ]

3 голосов
/ 02 февраля 2009

Как насчет использования шаблона Factory для возврата одного и того же экземпляра для каждого соединения, например,

ConnectionFactory::getInstance(ConnectionFactory::DEVELOPMENT);

Возвращает экземпляр Connection для подключения к базе данных разработки.

Реализация Connection должна выполняться только ConnectionFactory, который может хранить ссылки на эти экземпляры в статическом массиве с ключом типа соединения. Это позволяет избежать шаблона синглтона, но гарантирует, что вы поддерживаете только один экземпляр каждого Connection.

0 голосов
/ 02 февраля 2009

Я придумал это решение:

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');

Похоже, работает для меня. Это синглтон или что-то смешанное?

0 голосов
/ 02 февраля 2009

Как уже говорили другие, бросьте синглтон, тогда я, вероятно, сделаю что-то вроде этого:

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...
}

Поскольку как одно соединение, так и несколько классов соединения реализуют один и тот же интерфейс, вы можете использовать любой из них одинаково.

0 голосов
/ 02 февраля 2009

Как насчет отбрасывания паттерна синглтона, если вы хотите получить несколько? В последнее время Singleton стал анти-паттерном, поэтому вам, вероятно, следует отказаться от него, даже если вам нужно одно соединение. Не говоря уже о том, что расширение Singleton в PHP на данный момент довольно сложно.

0 голосов
/ 02 февраля 2009

Пул соединений.

В случае Java:

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

Этот пример просто показывает, как вы можете реализовать его еще лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...