#database #http #garbage-collection #database-connection #stateless
#База данных #http #сборка мусора #database-connection #без состояния
Вопрос:
Обычная проблема, которую я вижу во многих веб-языках, заключается в том, что соединения с базой данных должны быть закрыты, иначе общее количество соединений постепенно увеличивается, а затем оно останавливается в любой форме.
HTTP не имеет состояния, почему после завершения обработки запроса эти языки не могут просто удалить все соединения, открытые этим запросом? Существуют ли какие-либо законные причины, по которым вы могли бы оставить его открытым?
Комментарии:
1. Спасибо за комментарий избирателя, если есть проблема с этим вопросом!
Ответ №1:
Потому что стоимость открытия, аутентификации и авторизации доступа к базе данных довольно высока. Вот почему обычно все используют пул соединений с базами данных. Соединения все еще открыты, в то время как обработчики запросов получают доступное уже открытое соединение из пула. Когда кто-то закрывает соединение, на самом деле происходит то, что соединение освобождается для использования другими.
Чтобы ответить…
почему эти языки не могут просто удалить все соединения, открытые по запросу? Существуют ли какие-либо законные причины, по которым вы могли бы оставить его открытым?
Соединения могут оставаться открытыми после завершения запроса и использоваться для других целей. Например, асинхронные обновления данных. Но я с вами согласен, в 90% случаев, когда запрос завершен, открытые соединения должны быть возвращены обратно в пул. В зависимости от используемой вами веб-платформы (Spring, DJANGO, …) такое поведение может быть настроено или, по крайней мере, реализовано с минимальными усилиями.
Ответ №2:
Проверка открытого соединения при закрытии http-соединения приводит к увеличению накладных расходов, поэтому, я думаю, именно поэтому некоторые языки не закрывают его по умолчанию.
И если вы не закроете его явно, это должен будет сделать сборщик мусора, что может занять некоторое время.