PHP Veritabanı bağlantısı uygulama

2 Cevap php

Ben birden fazla veritabanı (Oracle, MySQL ve MSSQL) bağlanan bir komut dosyası var, her veritabanı bağlantısı, her seferinde komut dosyası çalışır kullanılan olmayabilir ama hepsi tek bir komut dosyası yürütme kullanılan olabilir. Benim soru, "tüm bağlantıları kullanılamaz olsa bile bir kez senaryonun başında tüm veritabanlarına bağlanmak için daha iyi mi edilir. Yoksa gerektiği gibi onlara bağlanmak için daha iyidir, sadece yakalamak ihtiyacım olduğunu ifade Bir döngü içinde bağlantı çağrı var (yani veritabanı bağlantısı döngü kez X miktar için yeni olurdu).

Evet Örnek Kod # 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
}

Evet Örnek Kod # 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);
}

şimdi kalıcı bir bağlantı kullanabilirsiniz biliyorum ama bu bir döngü içinde her veritabanı için açık bağlantı yanı olurdu? mysql_pconnect(), mssql_pconnect() ve adodb for Oracle persistent connection method gibi. Ben kalıcı bağlantısı da kaynak domuzu olabilir biliyorum ve ben en iyi performans / uygulama arıyorum gibi.

İşte why persistent connections could cause problems iyi bir yazıdır

2 Cevap

Tembel bir bağlantı sarıcı sınıfı kullanın:

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($pdo))
            $this->pdo = new PDO($this->dsn);

        //use pdo to do a query here

    }
}

Ben zaten PDO kullanarak umuyorum. Değilse, olmalıdır. PDO veritabanı bağımsızdır. Bu usul fonksiyonlarını kullanarak olmadıysa, her veritabanı türü için yeni bir sınıf oluşturmak gerekiyor.

Her neyse, bu (örneğin query() bir $params seçeneğini eklemek isterdim) sadece bir iskelet olduğunu, ancak fikir almak gerekir. Eğer query() çağırdığınızda bağlantısı sadece denenir. Nesneyi oluşturma bağlantı yapmaz.

Bir kenara, Doctrine kullanmayı düşünebilirsiniz. Bu tembel bağlantıları vardır ve genel olarak hayatı daha kolay hale getirir.

En iyi performans / uygulama kural basittir: sadece tek bir veritabanına bağlanmak yok.

Bağlarla - gelince bazı veritabanı erişimi sınıfını uygulamak için çalışın. Hangi talep üzerine otomatik olarak bağlanabilirsiniz.