Если HTTP не имеет состояния, зачем мне нужно закрывать соединение с базой данных?

#database #http #garbage-collection #database-connection #stateless

#База данных #http #сборка мусора #database-connection #без состояния

Вопрос:

Обычная проблема, которую я вижу во многих веб-языках, заключается в том, что соединения с базой данных должны быть закрыты, иначе общее количество соединений постепенно увеличивается, а затем оно останавливается в любой форме.

HTTP не имеет состояния, почему после завершения обработки запроса эти языки не могут просто удалить все соединения, открытые этим запросом? Существуют ли какие-либо законные причины, по которым вы могли бы оставить его открытым?

Комментарии:

1. Спасибо за комментарий избирателя, если есть проблема с этим вопросом!

Ответ №1:

Потому что стоимость открытия, аутентификации и авторизации доступа к базе данных довольно высока. Вот почему обычно все используют пул соединений с базами данных. Соединения все еще открыты, в то время как обработчики запросов получают доступное уже открытое соединение из пула. Когда кто-то закрывает соединение, на самом деле происходит то, что соединение освобождается для использования другими.

Чтобы ответить…

почему эти языки не могут просто удалить все соединения, открытые по запросу? Существуют ли какие-либо законные причины, по которым вы могли бы оставить его открытым?

Соединения могут оставаться открытыми после завершения запроса и использоваться для других целей. Например, асинхронные обновления данных. Но я с вами согласен, в 90% случаев, когда запрос завершен, открытые соединения должны быть возвращены обратно в пул. В зависимости от используемой вами веб-платформы (Spring, DJANGO, …) такое поведение может быть настроено или, по крайней мере, реализовано с минимальными усилиями.

Ответ №2:

Проверка открытого соединения при закрытии http-соединения приводит к увеличению накладных расходов, поэтому, я думаю, именно поэтому некоторые языки не закрывают его по умолчанию.

И если вы не закроете его явно, это должен будет сделать сборщик мусора, что может занять некоторое время.