Практика подключения базы данных 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
Лучшее правило производительности/практики просто: подключитесь только к одной базе данных.
Что касается подключений - попробуйте реализовать некоторый класс доступа к базе данных. Которые могут автоматически подключаться по требованию.