2010-04-01 87 views
4

我有一个连接到多个数据库(Oracle,MySQL和MSSQL)的脚本,每次脚本运行时可能不会使用每个数据库连接,但所有数据库连接都可以用于单个脚本执行。我的问题是,“在脚本开始时连接所有数据库是否更好,即使所有连接都可能不被使用,还是根据需要连接到它们,最好的办法就是我需要以具有在一个循环中的连接呼叫(以便数据库连接将新的用于在循环的次数X量)PHP数据库连接练习

呀示例代码#1:

// Connections at the beginning of the script 
$dbh_oracle = connect2db(); 
$dbh_mysql = connect2db(); 
$dbh_mssql = connect2db(); 

for ($i=1; $i<=5; $i++) { 
    // NOTE: might not use all the connections 
    $rs = queryDb($query,$dbh_*); // $dbh can be any of the 3 connections 
} 

呀实施例编号#2:

// Connections in the loop 
for ($i=1; $i<=5; $i++) { 
    // NOTE: Would use all the connections but connecting multiple times 
    $dbh_oracle = connect2db(); 
    $dbh_mysql = connect2db(); 
    $dbh_mssql = connect2db(); 

    $rs_oracle = queryDb($query,$dbh_oracle); 
    $rs_mysql = queryDb($query,$dbh_mysql); 
    $rs_mssql = queryDb($query,$dbh_mssql); 
} 

现在我知道你可以使用持续连接,但会那个循环中的每个数据库都打开一个连接?像mysql_pconnect()mssql_pconnect()adodb for Oracle persistent connection method。我知道持续连接也可以是资源浪费,并且我正在寻找最佳性能/实践。

这里是why persistent connections could cause problems

回答

15

使用延迟连接包装类:

class Connection 
{ 
    private $pdo; 
    private $dsn; 

    public __construct($dsn) 
    { 
     $this->dsn = $dsn; 
    } 

    public query($sql) 
    { 
     //the connection will get established here if it hasn't been already 
     if (is_null($this->pdo)) 
      $this->pdo = new PDO($this->dsn); 

     //use pdo to do a query here 

    } 
} 

我希望你已经使用PDO。如果不是,你应该是。 PDO与数据库无关。如果您使用过程函数来完成此操作,则必须为每种数据库类型创建一个新类。例如,这只是一个骷髅(例如,你想在query()中添加一个$params选项),但是你应该能够明白这个想法。只有在致电query()时才会尝试连接。构建对象不会建立连接。

另外,考虑使用Doctrine。它有着懒惰的联系,使得整个生活更加简单。

+0

我喜欢这种方法,我有一个类似的类,我创建了使用类型(mysql,mssql,oracle)来定义连接/查询功能的XML配置和通用连接和查询类。 – 2010-04-01 14:31:58

+1

@Phill如果您使用PDO,甚至不需要这样做,它可以在不更改代码的情况下无论连接到哪个数据库都能正常工作。 – ryeguy 2010-04-01 14:39:26

+0

将不得不检查PDO,再次thnx – 2010-04-01 14:46:45

2

一个好职位的最佳性能/做法规则很简单:你只能连接到一个数据库。

至于连接 - 尝试实现一些数据库访问类。它可以根据需要自动连接。

+1

+1如果您不知道,如果需要特定的连接,请使用仅在使用时才变为活动状态的延迟连接。 – selfawaresoup 2010-04-01 13:32:00

+0

懒惰的连接?我从来没有听说过这个,你能提供一个好的资源吗?谷歌搜索以及。谢谢 – 2010-04-01 13:39:41

+0

@Phill:查看我的答案。 – ryeguy 2010-04-01 13:58:17