Практика подключения базы данных PHP

У меня есть script, который подключается к нескольким базам данных (Oracle, MySQL и MSSQL), каждое подключение к базе данных не может использоваться каждый раз при запуске script, но все могут быть использованы в одном выполнении script. Мой вопрос: "Лучше ли подключаться ко всем базам данных один раз в начале script, хотя все соединения могут не использоваться. Или лучше подключиться к ним по мере необходимости, единственный улов - это то, что я должен был иметь вызов соединения в цикле (поэтому соединение с базой данных было бы новым для X количества раз в цикле).

Да Пример кода №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 для метода постоянных соединений Oracle. Я знаю, что постоянное соединение также может быть ресурсоемкой, и поскольку я ищу лучшую производительность/практику.

Вот хороший пост на почему постоянные подключения могут вызвать проблемы

Ответ 1

Использовать ленивый класс оболочки подключения:

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 - независимая база данных. Если вы сделали это с помощью процедурных функций, вам нужно было бы создать новый класс для каждого типа базы данных.

В любом случае, это всего лишь скелет (вы хотите добавить опцию $params в query(), например), но вы должны иметь возможность получить эту идею. Соединение выполняется только при вызове query(). Построение объекта не создает соединение.

В качестве альтернативы рассмотрите возможность использования Doctrine. Он имеет ленивые связи и облегчает жизнь в целом.

Ответ 2

Лучшее правило производительности/практики просто: подключитесь только к одной базе данных.

Что касается подключений - попробуйте реализовать некоторый класс доступа к базе данных. Которые могут автоматически подключаться по требованию.