配置具有多个数据库连接的PHP应用程序


configure php app with multiple database connections

我有一个php页面与几个数据库。我一直读到多个数据库是不好的,你应该把它们合并成一个,但是我想把它们分开,以便更好地组织。

假设我使用多个数据库。这很糟糕吗?现在我看到了mysql_max_connections的问题。我在研究获取连接的单例方法。但是单例类似乎只适用于一个数据库连接。是这样吗?我需要为每个数据库创建一个单独的单例类吗?

澄清:我预计数据库会变得相当大。我已经在一个数据库上有几百个表,并且还添加了新的内容。我听说您不希望在任何特定的数据库中有超过几千个表。也许最好的答案是以某种方式将所有内容组合起来,但这需要进行重大改革,因此我希望坚持使用多个数据库。我只是想知道什么是最有效的方式来组织多个数据库的连接。

典型的单例模式如下:

class Singleton{
    private static $instance;
    private function __construct(){}
    private function __clone(){}
    public function Instance(){
        if(!self::$instance){
            self::$instance = new self;
        }
        return self::$instance;
    }
}

但是您可以通过拥有多个实例来扩展它,但每个实例之间略有不同:

class MultiSingleton{
    private static $instance = array();
    private function __construct(){}
    private function __clone(){}
    public function Instance($index = 'default'){
        if(!isset(self::$instance[$index])){
            self::$instance[$index] = new MultiSingleton($index);
        }
        return self::$instance[$index];
    }
}

这样你就可以用一个类来管理所有的类;)并且仍然遵循单例模式

使用多个数据库相当容易。mysql_connect()返回一个Resource值,该值标识连接。您可以将该值添加到,例如,mysql_query():

$db1 = mysql_connect("localhost");    
$db2 = mysql_connect("google.com");
$query1 = mysql_query("select ....", $db1);
$query2 = mysql_query("select ....", $db2);

我不确定我是否理解了这个问题,你的意思是"所以我正在寻找获得连接的单例方法",我知道单例是什么,但我真的看不到你打算做什么。此外,我不知道mysql_max_connections与所有这些有什么关系,它与您的要求完全无关。

我可能会建议你创建一个通用的接口到所有的数据库,像一个包装类命名为"DB"(作为一个单例,如果你想),并定义一些方法来查询数据库,这样调用者不必"知道"从哪个DB获取数据。

但这一切似乎都没有意义…

EDIT:(另见注释)

1)为了显著减少连接数,使用mysql_pconnect()。但是仔细阅读文档,我知道有一些顾虑。

2)通用代码。会花很多功夫,但很值得。我是这样做的:

  • 我创建了一个查询存储库,其中包含一堆每个人都以敏感标题命名的查询和一些SQL代码,如"SELECT foo, bar FROM foobar WHERE bar ="?'
  • 我创建了一个名为query(或类似的东西)的函数的DB类,它接受查询名称,查询参数作为数组,并透明地构建实际的查询字符串,在该查询类型的适当数据库上执行它!
  • 函数返回一个对象的句柄,该对象可以遍历查询结果,很像mysql_fetch_array,但更好。

如果在将来你要放弃mysql为其他任何东西,它将工作不改变调用代码。如果合并两个数据库,结果相同。

编辑(2):哦,看来我终于明白你的问题了。您的数据库(或者更好的是模式)不止一个,但是DBMS只是在本地主机上运行的MySQL的单个实例?如果是这样,您可以简单地编辑您的查询。"SELECT * FROM database. "table WHERE…"