Singleton パターンを使用して複数の DB 接続を作成するにはどうすればよいですか? または、同じクラスを共有するが複数の接続を共有するためのより良いアプローチがあるでしょうか?
5 に答える
Factory パターンを使用して、接続ごとに同じインスタンスを返すのはどうでしょうか。
ConnectionFactory::getInstance(ConnectionFactory::DEVELOPMENT);
Connection
開発データベースへの接続 のインスタンスを返します。
のインスタンス化は、接続タイプによってキー付けされた静的配列内のインスタンスへの参照を保持できるConnection
によってのみ実行する必要があります。ConnectionFactory
これにより、シングルトン パターンが回避されますが、各 の 1 つのインスタンスのみを維持することが保証されますConnection
。
私はこの解決策を思いついた:
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');
私にとってはうまくいくようです。これはシングルトンパターンですか、それとも混合されたものですか?
接続プーリング。
ジャバの場合:
http://java.sun.com/developer/onlineTraining/Programming/JDCBook/Code/JDCConnectionPool.java
この例は方法を示しているだけで、さらに良い方法で実装できます。
必要なものが複数ある場合は、Singleton パターンをドロップするのはどうですか? 最近、Singleton はアンチパターンになっているため、単一の接続が必要な場合でも、おそらく削除する必要があります。言うまでもなく、PHP で Singleton を拡張することは、現時点では非常に困難です。
他の人が言ったように、シングルトンをドロップすると、おそらく次のようになります。
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...
}
単一接続クラスと複数接続クラスの両方が同じインターフェイスを実装しているため、どちらもまったく同じ方法で使用できます。