MySQL - постоянное соединение против пула соединений - PullRequest
43 голосов
/ 16 марта 2012

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

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

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

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

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

Ответы [ 2 ]

26 голосов
/ 16 марта 2012

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

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

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

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

17 голосов
/ 16 марта 2012

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

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

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

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

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

...