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?
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.
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ı?