2010-01-16 1 views
9

Я хочу услышать, что другие думают об этом? В настоящее время я подключаю базу данных mysql внутри файла типа заголовка, который затем включается в верхнюю часть каждой страницы моего сайта. Затем я могу запускать столько запросов, сколько хочу на этом открытом соединении. ЕСЛИ страница построена из 6 включенных файлов и существует 15 различных запросов mysql, тогда все они будут работать в этом 1 соединении.В PHP/MySQL следует открыть несколько соединений с базой данных или поделиться 1?

Теперь иногда я вижу классы, которые делают несколько соединений, например 1 для каждого запроса.

Есть ли какая-либо польза от использования одного метода над другим? Я думаю, что 1 соединение лучше, чем несколько, но я могу ошибаться?

+1

Со многими базами данных (например, POSTGRESQL) открытие соединений является дорогостоящим. Auth должен быть проверен, выделены буферы ... он может запускать хорошие 30 миллисекунд в моем dev-блоке, иногда, если не дольше. Это менее верно для mysql - соединения быстрее. Но все еще будет накладные расходы, поэтому подключение настолько редки, насколько это возможно. –

ответ

10

Создание соединений может быть дорогим ( у меня нет ссылки на это заявление как ещеEdit: Aha Here it is), так что кажется, что консенсус является использование меньшего количества соединений. Использование единого соединения для всех запросов на одной странице, по-видимому, является лучшим выбором, чем несколько подключений.

+0

+1, хорошая ссылка ... –

+0

Вы не только должны использовать одно соединение для HTTP-запроса, вам следует использовать использование постоянных подключений для масштабирования вашего приложения. Оба интерфейса mysqli и PDO в PHP поддерживают постоянные соединения. – Kitson

6

В PHP + MySQL обычно нет большого смысла использовать несколько соединений на странице (только медленнее и немного больше потребляемой памяти).

Единственный способ, который может быть полезен, - это изменить параметры соединения, которые могут влиять на другие страницы (например, сортировка). Но хорошие PHP-программы обычно никогда не делают такого рода вещи.

Кроме того, рекомендуется включить постоянные подключения, так что 1 соединение с MySQL будет повторно использовано для выполнения кратных страниц.

+0

+1 для ваших первых двух очков - прямо на деньги. Но что касается последнего момента, постоянные соединения - это еще не все, что они взломали. Например, любое состояние соединения переносится из сценария в сценарий, что может иметь непреднамеренные последствия (временные таблицы, которые не очищаются, оборванные транзакции и т. Д.). Кроме того, вы получаете множество ваших ценных подключений к базе данных, подключенных к потокам бездействия apache, что является просто пустой тратой ресурсов. Лучше использовать реальный пул соединений по строкам SQLAlchemy –

2

Если действительно зависит от уровня активности, который, как вы подозреваете, будет генерировать сайт - если это веб-сайт с высоким трафиком, вы скоро закончите соединения (если вы не настроите максимальное подключение MySQLs к глупому уровню, но это, в конечном итоге, остановит сервер).

Я бы рекомендовал, чтобы передняя часть веб-сайта использовала общий объект базы данных (singleton is your friend), поскольку для этого не требуется много дисциплины, чтобы писать с этим умом, и вы не будете тратить впустую время соединения. Если вам потребуются дополнительные параллельные запросы на бэкэнд, это не должно быть такой сделкой, поскольку это вряд ли будет областью с высокой нагрузкой.

1

Я не вижу никакой пользы от использования нескольких соединений, я бы скорее подумал, что это признак плохой структуры. Вот причины, по которым я могу думать против использования нескольких соединений:

  • Необходимо инициализировать базу данных несколько раз. Настройка свойств соединения при установлении соединения (например, SET NAMES UTF8) должна выполняться на нескольких линиях.
  • Это определенно медленнее, чем одно соединение.
  • Нетехническая причина. Кто-то, кто работает с вашим кодом, скорее всего, не ожидает этого и может потратить часы на отладку свойств соединения, которые он установил в другом соединении.

Наличие глобального объекта соединения (или класса, обеспечивающего его) является гораздо лучшим подходом в PHP.

1

Вы уверены, что классы, которые выполняют несколько соединений, не просто возвращают ссылку на уже открытое соединение, если оно открыто? Я видел много вещей, структурированных таким образом. Лучше всего использовать только одно соединение на странице.

2

Не рекомендуется выполнять несколько небольших запросов, где работа может быть выполнена с использованием только одного запроса, вы можете использовать один запрос для получения данных из нескольких таблиц и, например, нескольких баз данных. см ссылку ниже:

http://www.x-developer.com/php-scripts/sql-connecting-multiple-databases-in-a-single-query

Смежные вопросы