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

104
08 мая 2021, 09:00

Вопрос по большой части про безопасность. Не могу определиться какой подход лучше для систем с постоянно активными более 100 пользователей:

  1. В глобальном классе приложения сделать свойство db, который создает новый экземпляр класса Database. В его конструкторе сразу открывается соединение с базой. Все дальнейшие обращения будет на уровне: Application::$app->db->....
  2. Создавать соединение (new Database) только в том месте, где надо.

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

В первом случае, меньшее число соединений (единственное на пользователя), во втором - нет постоянно открытого соединения.

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

Answer 1

В некоторых распространенных фреймворках этот вопрос решается обычно достаточно просто - или использованием паттерна Singleton ("Одиночка") для запроса соединения с базой, или неявным созданием опять же одного объекта DAO для доступа к данным (которое остается скрытым "под капотом") при обращении к модели. Таким образом, и соединение не открывается пока не потребуется (а если не требуется - вообще не откроется), и соединение имеется в количестве адын штук на обрабатываемый HTTP-запрос, чего в подавляющем большинстве случаев хватает.

Примеры организации соединений с БД: Laravel, Yii.

Про Symfony писать не буду, там возможны различные разности - и Doctrine, и Eloquent, и черт в ступе, и лягушка в супе.

Таким образом, по практике использования можно сделать вывод - лучше всего создание соединения с БД "спрятать под капот" при обращении к высокоуровневым операциям, и "не светить" в таких местах, как контроллер. Хотя, если Вы (как и я) предпочитаете в некоторых случаях осуществлять "закат солнца вручную" и "после сборки обработать напильником" для достижения оптимальной производительности - посмотрите в сторону Singleton'а и пакета Capsule.

READ ALSO
Не работают фильтры

Не работают фильтры

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

103
Php - регулярное выражение помогите)

Php - регулярное выражение помогите)

подскажите пожалуйста есть письма заголовки писем, подскажите как убрать Re[ ]: регулярным выражением php

88
Почему the_post() не отображает пост?

Почему the_post() не отображает пост?

Переходя на ссылку поста не получается получить пост из the_post код следующий

95