如何使用Singleton模式创建多个数据库连接?或者也许有更好的方法,共享相同的类但多个连接?
答案 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');
似乎对我有用。这是单身模式还是混合的东西?