使用多个数据库连接配置php app

时间:2011-04-10 21:55:22

标签: php database-design

我有一个包含多个数据库的php页面。我一直在读,多个数据库都很糟糕,你应该把它们合二为一,但我想把事情分开,以便更好地组织。

所以我想说我会留在多个数据库中。那不好吗?现在我看到了mysql_max_connections的问题。所以我正在寻找用于获取连接的单例方法。但单例类似乎只适用于一个数据库连接。是这样的吗?我是否需要为每个数据库创建一个单独的单例类?

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

3 个答案:

答案 0 :(得分:1)

典型的单身人士看起来像:

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];
    }
}

这样你可以有一个类来统治它们;)并且仍然遵循单例模式

答案 1 :(得分:0)

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

$db1 = mysql_connect("localhost");    
$db2 = mysql_connect("google.com");

$query1 = mysql_query("select ....", $db1);
$query2 = mysql_query("select ....", $db2);

答案 2 :(得分:0)

我不确定我是否明白这个问题,你的意思是“所以我正在寻找单身方法来获取连接”,我知道单身是什么但是我真的看不到你打算做什么。更多,我没有看到mysql_max_connections与所有这些有什么关系,它与你提出的问题毫无关系。

我可能建议您为所有数据库创建一个公共接口,比如名为“DB”的包装类(如果需要,作为单例),并定义一些查询数据库的方法,以便被调用者不会必须“知道”从哪个DB获取数据。

但所有这一切似乎毫无意义......

编辑:(另见评论)

1)要显着减少连接数,请使用mysql_pconnect()。但仔细阅读文档,我知道有一些问题。

2)通用代码。这需要大量的工作,但这是值得的。我这样做:

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

如果将来你会删除mysql的其他任何内容,它将在不改变被调用者代码的情况下工作。如果合并两个数据库,则相同。

编辑(2):哦,好像我终于理解了你的要求。您的数据库(或更好的架构)不止一个,但DBMS只是在localhost上运行的MySQL的一个实例?如果是这样的话,您可以简单地编辑您的查询。 “SELECT * FROM database.table WHERE ...”