Чтобы избежать накладных расходов на установление нового соединения каждый раз, когда запрос необходимо запустить против MySQL, доступны два варианта:
- Постоянные соединения, при которых запрашивается новое соединение, проверяется, открыто ли "идентичное" соединение и если оно его использует.
- Пул соединений, при котором клиент поддерживает пул соединений, так что каждый поток, который должен использовать соединение, будет проверять один из пула и возвращать его обратно в пул, когда это будет сделано.
Итак, если у меня есть многопоточное серверное приложение, которое должно обрабатывать тысячи запросов в секунду, и каждый поток должен запускать запрос к базе данных, то какой вариант лучше?
С моей точки зрения, при постоянных подключениях все потоки в моем приложении будут пытаться использовать одно и то же постоянное соединение с базой данных, потому что все они используют одинаковые соединения. Таким образом, это одно соединение, разделенное между несколькими потоками приложений - в результате в ближайшее время запросы будут блокироваться на стороне базы данных.
Если я использую механизм объединения пулов, у меня будут все потоки приложений, совместно использующие пул соединений. Таким образом, существует меньше возможности запроса блокировки. Однако при подключении пула приложений, если поток приложений ожидает получения соединения из пула или должен ли он отправлять запрос на соединения в пуле в любом случае циклически, и пусть очереди, если они есть, происходят в базе данных?