2012-03-16 2 views
35

Для того, чтобы избежать накладных расходов на создание нового соединения каждый раз, когда потребности запроса обжигали на MySQL, есть две опции:MySQL - постоянное подключение против Пулы соединений

  1. Постоянные соединения, в результате чего новое соединение запросил проверку, чтобы проверить, открыто ли «идентичное» соединение и если оно его использует.
  2. Пул соединений, при котором клиент поддерживает пул соединений, так что каждый поток, который должен использовать соединение, будет проверять один из пула и возвращать его обратно в пул по завершении.

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

С моей точки зрения, при постоянном подключении все потоки в моем приложении будут пытаться использовать одно и то же постоянное соединение с базой данных, потому что все они используют одинаковые соединения. Таким образом, это одно соединение, разделенное между несколькими потоками приложений - в результате в ближайшее время запросы будут блокироваться на стороне базы данных.

Если я использую механизм объединения соединений, у меня будут все потоки приложений, совместно использующие пул соединений. Таким образом, существует меньше возможности запроса блокировки. Однако при подключении пула приложений, если поток приложений ожидает получения соединения из пула или должен ли он отправлять запрос на соединения в пуле в любом случае циклически, и пусть очереди, если они есть, происходят в базе данных?

ответ

22

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

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

Если ваше приложение имеет только несколько длинных потоков, требующих соединений, вы также можете открыть соединение для каждого потока и оставить его открытым.

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

+0

В случае объединения пула разработчик приложения может контролировать, когда и сколько подключений должно быть открыто/закрыто. Для MySQL, как можно контролировать количество «идентичных» постоянных соединений? Существуют ли какие-либо параметры конфигурации сервера для одного и того же? – user1259642

+2

В пулах, которые я использую, вы устанавливаете минимальный и максимальный размер пула и определяете время простоя, после которого соединение закрывается (плюс некоторые другие вещи). – mrab

15

Что касается вашего вопроса о том, должен ли сервер приложений ждать соединения, то да.

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

Невозможно отправить два запроса по одному и тому же соединению и посмотреть, что возвращает. Вы можете отправлять только один запрос за раз.

Таким образом, как правило, один поток в пуле соединений состоит из одного клиентского соединения (в вашем случае сервер приложений - это клиент) и одно соединение на стороне сервера (база данных).

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

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