У меня есть сценарий, который подключается к нескольким базам данных (Oracle, MySQL и MSSQL), каждое подключение к базе данных не может использоваться каждый раз, когда выполняется сценарий, но все они могут использоваться в одном сценарии. Мой вопрос: «Лучше ли подключаться ко всем базам данных один раз в начале скрипта, даже если все соединения могут не использоваться. Или лучше подключиться к ним по мере необходимости, единственный улов, который мне понадобится для вызова соединения в цикле (поэтому соединение с базой данных было бы новым для 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 . Я знаю, что постоянное соединение также может быть ресурсным свиноматом, и поскольку я ищу лучшую производительность / практику.
Вот хорошая статья о том, почему постоянные соединения могут вызвать проблемы
Используйте класс lazy wrapper:
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()
. Построение объекта не создает соединение.
В стороне, рассмотрите использование Доктрины . Он имеет ленивые связи и облегчает жизнь в целом.
Лучшее правило производительности / практики просто: подключитесь только к одной базе данных.
Что касается подключений – попробуйте реализовать некоторый класс доступа к базе данных. Которые могут автоматически подключаться по требованию.