Birden fazla DB bağlantısı sınıf

5 Cevap php

Nasıl Singleton deseni kullanarak birden fazla DB bağlantı oluşturabilirim? Ya da belki daha iyi bir yaklaşım aynı sınıf ancak birden bağlantıları paylaşmak, var?

5 Cevap

Nasıl, örneğin, her bağlantı için aynı örneği dönmek için bir Fabrika desen kullanma hakkında

ConnectionFactory::getInstance(ConnectionFactory::DEVELOPMENT);

Geliştirme veritabanına bir bağlantı için bir Connection örneğini döndürür.

Connection sadece bağlantı türüne göre anahtarlı bir statik dizide bu örnekleri başvurular tutabilirsiniz ConnectionFactory, tarafından yapılmalıdır ve örnekleme. Bu singleton deseni önlemek, ama sadece her Connection tek bir örneğini muhafaza sağlar.

Bağlantı havuzu.

Java durumda:

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

Bu örnek sadece yol gösterir, yine de daha iyi bir şekilde uygulayabilirsiniz.

Nasıl ne istediğiniz birden fazla ise Singleton deseni bırakarak hakkında? Tek bir bağlantı gerekir bile muhtemelen bunu bırakın bu yüzden son zamanlarda, Singleton bir anti-pattern haline gelmiştir. PHP Singleton uzanan an için oldukça zor olduğunu cabası.

Diğerleri söylediler, tekiz damla, sonra, muhtemelen böyle bir şey yapmak istiyorum:

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

Sonra, birden fazla bağlantı alır başka bir sınıf:

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

Tek bağlantı ve çoklu bağlantı sınıflar hem aynı arabirimi uygulamak gibi tam aynı şekilde kullanabilirsiniz.

Ben bu çözüm ile geldim:

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

Benim için eser gibi görünüyor. Bu bir Singleton deseni falan karışık mı?