Веб-приложение: сохранить курсор БД или воссоздать? - PullRequest
1 голос
/ 11 марта 2010
  1. Должен ли я инициализировать курсор базы данных один раз для каждого потока Apache или мне нужно инициализировать один в каждой функции, доступной для клиентов HTTP?

  2. Что происходит, когда клиент прерывает соединение (то есть пользователь закрывает вкладку браузера)? Работает ли серверная функция, которая обрабатывала запрос, нормально до тех пор, пока он не вернется, или он немедленно завершается без возможности закрыть все транзакции?

Ответы [ 2 ]

0 голосов
/ 11 марта 2010
  1. Я думаю, инициализация таких ресурсов, как соединение с базой данных или курсор в порядке для каждого потока. Некоторые фреймворки / библиотеки для этого используют локальные «глобальные» переменные потока. Знайте о максимальном клиентском соединении базы данных. Оставлять ли соединение db по-прежнему открытым или тратить некоторое время на подключение к db для каждого запроса, зависит от вашего решения. От сервера базы данных также зависит, сколько ресурсов требуется для каждого соединения - AFAIK PostgreSQL разветвляет новый процесс для соединения (что довольно дорого), в то время как MySQL использует потоки.

  2. Это зависит от того, на каком веб-сервере работает ваше приложение. Если кто-то закроет вкладку браузера, вы, вероятно, заметите это, когда захотите записать HTTP-ответ в сокет - это должно вызвать ошибку записи или что-то в этом роде. Но я могу представить себе веб-сервер, который настроен на уничтожение процесса / потока при обнаружении закрытого соединения с клиентом. Но все же есть некоторые ситуации, когда веб-приложение немедленно завершается - например, отключение питания :) или принудительный (веб) перезапуск сервера.

  3. Небольшая подсказка - вы должны проверить и откатить транзакцию перед обработкой HTTP-запроса, только на случай, если при обработке последнего запроса было сгенерировано исключение, и соединение не было должным образом отменено. (Или вы можете сделать это после обработки HTTP-запроса.) Перед обработкой HTTP-запроса также убедитесь, что соединение с БД все еще живое (оно может быть отключено по времени).

0 голосов
/ 11 марта 2010

Курсоры - дорогие ресурсы.

Обычно ...

  1. Открывайте их тогда, когда они вам нужны.

  2. Закройте их, как только закончите.

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

Сервер не знает, что происходит в браузере. Нуль. Каждый запрос от браузера - это отдельное уникальное отключенное событие.

Если браузер «закрывается», это ничего не значит. Это только означает, что сервер больше не получает никаких запросов.

Если сервер пытался загрузить ответ, сокет падает, и сервер в конечном итоге прекращает попытки.

Если сервер ничего не обрабатывал, он все равно ничего не обрабатывал.

...