PostgreSQL: время ожидания сеанса? - PullRequest
0 голосов
/ 30 июня 2011

Я ищу способ контролировать время ожидания сеанса клиента PGSQL (9.0) (Windows).

Когда сеанс умирает?Что случилось с ними после смерти.

Как я могу заставить Сессию умереть?(Например, он «заблокирован» при неправильном длинном запросе, и я хочу заставить сервер освободить ресурсы).

Спасибо за это: dd


Я расширяюэто, чтобы понять это: базы данных должны знать, какой сеанс мертв.Мертвая сессия должна быть освобождена, потому что она только удерживает ресурсы, и если эта операция не завершена, мы должны получить много блокировок или мы можем выйти из доступных соединений (достичь максимума).

Другие базы данных (FireBird, EDB) определяет для него параметр TimeOut.

Когда он достигнут, сеанс устарел, а пользовательское соединение прервано.

Чтобы избежать исчерпания, вам нужно периодически что-то делать, что расширяетperiod.

Существует 3 способа достичь времени ожидания: 1.) клиентская программа зависла, зависла или закрылась.2.) сетевое соединение разорвано 3.) клиент отправляет очень длинный запрос / хранимую процедуру, которая не завершается.

Если тайм-аут не обработан сервером, возможно, чья-то транзакция, блокировка и т. Д. Еще живыX часов, и у вас есть только один способ удалить его: перезапустить службу db-сервера.

Другие базы данных обрабатывают мертвые сеансы, так как они больше не взаимодействуют с сервером, поэтому клиент получил некоторую ошибку, ему нужноперезапустите клиентское программное обеспечение.

Некоторые базы данных поддерживают возврат к «неактивному», но «не мертвому» сеансу, и они могут продолжить работу.

Итак, с этим предисловием я задаю свой вопросеще раз:

  1. Как я могу контролировать время ожидания сеанса клиента под pgsql?Системная переменная, параметр SQL и т. Д.
  2. Как мне продлить это время?
  3. Что произойдет, если длинный запрос исчерпывает период?
  4. Когда сервер pgsql выпускаетресурсы, удерживаемые клиентом?

Спасибо: дд

Ответы [ 2 ]

1 голос
/ 30 июня 2011

Я не понимаю первую часть вашего вопроса, но чтобы убить текущий сеанс, вы можете использовать pg_terminate_backend()

Чтобы убить запрос запущенного сеанса, используйте pg_cancel_query()

Обе функции описаны в руководстве:

http://www.postgresql.org/docs/current/static/functions-admin.html#FUNCTIONS-ADMIN-SIGNAL-TABLE

0 голосов
/ 06 августа 2011

Существует три способа достичь времени ожидания: 1.) клиентская программа зависла, зависла или закрылась.2.) разорвано сетевое соединение 3.) клиент отправляет очень длинный запрос / хранимую процедуру, которая не завершается.

Для 2 могут быть полезны настройки tcp_keepalives_ *: http://www.postgresql.org/docs/8.4/static/runtime-config-connection.html

Для 3 существует настройка Statement_timeout: http://www.postgresql.org/docs/8.4/static/runtime-config-client.html, но это приведет только к завершению оператора, а не соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...