Если HTTP не имеет состояния, зачем мне закрывать соединение с базой данных? - PullRequest
4 голосов
/ 24 мая 2011

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

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

Ответы [ 2 ]

4 голосов
/ 24 мая 2011

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

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

почему эти языки нельзя просто отбросить какие соединения этот запрос открыт? Есть ли законные причины для почему вы можете держать его открытым?

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

0 голосов
/ 24 мая 2011

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

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

...