如何使用单例模式创建多个数据库连接?或者也许有更好的方法,共享同一个类但有多个连接?
Mark Tyler
问问题
1946 次
5 回答
3
如何使用工厂模式为每个连接返回相同的实例,例如
ConnectionFactory::getInstance(ConnectionFactory::DEVELOPMENT);
返回一个Connection
连接到开发数据库的实例。
的实例化Connection
只能由 执行ConnectionFactory
,它可以将这些实例的引用保存在静态数组中,由连接类型键入。这避免了单例模式,但确保您只维护每个Connection
.
于 2009-02-02T09:37:32.880 回答
0
连接池。
在java的情况下:
http://java.sun.com/developer/onlineTraining/Programming/JDCBook/Code/JDCConnectionPool.java
这个例子只是展示了方法,你可以用更好的方式来实现它。
于 2009-02-02T09:37:19.853 回答
0
如果你想要的是多个,那么放弃单例模式怎么样?最近,Singleton 已成为一种反模式,因此即使您需要单个连接,您也应该放弃它。更不用说在 PHP 中扩展 Singleton 目前是相当困难的。
于 2009-02-02T09:39:53.607 回答
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...
}
由于单个连接和多个连接类都实现了相同的接口,因此您可以以完全相同的方式使用它们。
于 2009-02-02T10:16:53.267 回答
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');
似乎对我有用。这是单例模式还是混合模式?
于 2009-02-02T12:50:17.483 回答