SMProxy
Mysql database connection pool
https://github.com/louislivi/SMProxy
Идея постоянных подключений состоит в том, чтобы соединение между клиентским процессом и базой данных можно было использовать повторно, особенно когда требуется создавать и закрывать соединения множество раз. Это бы позволило снизить накладные расходы на создание новых подключений каждый раз, когда они требуются, за счёт использования существующих кешированных подключений, свободных для повторного использования.
В отличие от модуля mysql, в mysqli нет отдельной функции для создания
постоянных соединений. Чтобы открыть постоянное соединение, при создании
подключения к имени хоста нужно добавить префикс p:
.
При использовании постоянных соединений можно столкнуться с проблемой, которая
заключается в том, что клиенты могут оставлять такие подключения в
непредсказуемом состоянии. Например, клиент ставит блокировку
на таблицу, а затем аварийно завершает работу. То есть блокировка снята не
будет. Новый клиентский процесс, использующий это подключение повторно, получит
его как есть
, и вынужден будет провести какую-то очистку
подключения, прежде чем начать его использовать. Соответственно, в задачи
программиста входит ещё и проверка подобных ситуаций и внедрение кода,
осуществляющего такую очистку.
Тем не менее, в mysqli
эта проблема решена. В модуле
есть встроенный функционал, осуществляющий очистку соединений и
переводящий их в состояние пригодное для использования. Код очистки,
реализованный в mysqli
включает следующие операции:
Откат активных транзакций
Закрытие и удаление временных таблиц
Снятие блокировки с таблиц
Сброс переменных сессии
Закрытие подготовленных запросов (всегда происходит в PHP)
Закрытие обработчиков
Снятие блокировок, установленных функцией GET_LOCK()
Это позволяет быть уверенным в том, что возвращённые из пула соединения готовы к использованию в клиентских процессах.
Модуль mysqli
делает очистку соединений автоматически
путём вызова C-API функции mysql_change_user()
.
Автоматическая очистка имеет свои достоинства и недостатки. Как плюс, программисту больше не надо заботиться об очистке соединения, все делается автоматически. Однако, это не лучшим образом влияет на производительность, скрипт потенциально может работать медленней, так как автоматическая чистка запускается каждый раз, когда соединение извлекается из пула.
Есть возможность отключить автоматическую очистку соединений, если скомпилировать
PHP с директивой MYSQLI_NO_CHANGE_USER_ON_PCONNECT
.
Замечание:
Постоянные соединения поддерживаются модулем
mysqli
как при работе с родным MySQL-драйвером, так и при работе с клиентской библиотекой MySQL.
SMProxy
Mysql database connection pool
https://github.com/louislivi/SMProxy