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

Во всех туториалах для Ноды и Экспресса банально создается одно глобальное подключение к базе (будем говорить про MySQL). Тут же, в коде приложения, описываются все вьюхи, которые этим соединением оперируют.

Меня же волнуют следующие моменты:

1) Как лучше сделать подключение доступным везде, в.т.ч. другим модулям? Объявлять его в globals или хранить в своем модуле?
2) Стоит ли хранить и поддерживать одно подключение или на каждый запрос создавать новое? В первом случае: что делать, если сервер БД разорвал его?
3) Читал про пул соединений, что нужно каждое соединение возвращать в пул, вызывая метод end(). Как сделать так, чтобы оно само возвращалось по завершении запроса? Потому что из одной вьюхи может быть много точек выхода, прописывать в каждой conn.end() утомляет.
4) Следует из 3) Пытался в проекте сделать пул, все соединения закрывал, сервер MySQL все равно показывает, что кол-во соединений растет. В чем может быть дело?

Спасибо.
  • Вопрос задан
  • 6179 просмотров
Пригласить эксперта
Ответы на вопрос 2
Stdit
@Stdit
Однажды ошибка в этом месте (делать одно глобальное соединение с БД) стоила мне целых выходных. Сразу оговорюсь, что использовался не mysql, а модуль node-postgres, но суть должна быть одинаковой. При большой нарузке длинные запросы блокировали сокет базы, и как следствие работу всего сервиса. Поэтому нужно было срочно переделывать модель на Connection Pool, который на этапе разработки как-то ушел из внимания, так как на одном коннекте с небольшой бд тестовых данных вроде бы все было хорошо. :)

Пул может организовать несколько параллельных подключений, которые не будут мешать друг другу. По окончании запроса подключение освобождается и уходит в пул. При отсутсвии свободных слотов в пуле запрос ставится в очередь до освобождения одного из слотов. Что касается доступа в БД, я использовал простейший вариант — непосредственный доступ через модуль и его параметры подключения по умолчанию. В каждом файле, который нуждается в БД, делается require драйвера БД и через него происходит обращение в базу. При использовании пула надо обязательно следить за освобождением соединений (функция done). Количество соединений в пуле задается опцией настроек модуля.

О том, как использовать пул в pg, можно почитать здесь.
Ответ написан
igrishaev
@igrishaev Автор вопроса
Спасибо за ответ, буду переписывать проект под пул.
А все-таки, можно сделать так, чтобы соединение сам уходило в пул после выполнения запроса? Миддлварь или переопределить какую-то функцию?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы