powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Таймаут open cursor for execute
8 сообщений из 8, страница 1 из 1
Таймаут open cursor for execute
    #39658633
sKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня, коллеги!

Подскажите, пожалуйста, есть ли какой-либо способ установить таймаут на выполнение курсора
Код: sql
1.
open cursor_name no scroll for execute <Текст Запроса>;


внутри хранимой процедуры?

Отслеживание таймаута в клиенте - не вариант, т.к. использутюся постоянные соединения (persist connection).
Использование обычных соединений в клиенте тоже не вариант - периодически нагрузка бывает до 2000 запросов к серверу приложений в секунду.
...
Рейтинг: 0 / 0
Таймаут open cursor for execute
    #39658747
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sKotДоброго дня, коллеги!

Подскажите, пожалуйста, есть ли какой-либо способ установить таймаут на выполнение курсора
Код: sql
1.
open cursor_name no scroll for execute <Текст Запроса>;


внутри хранимой процедуры?

Отслеживание таймаута в клиенте - не вариант, т.к. использутюся постоянные соединения (persist connection).
Использование обычных соединений в клиенте тоже не вариант - периодически нагрузка бывает до 2000 запросов к серверу приложений в секунду.
для любителей гамака и лыж -- открыть в соединении дблинк--сессию. в котором запустить асинхронно отложенный пж-кенсел-бекенд головной, и(?или) пж-кенсел/терминейт-бекенд самое себя. ну и обработчик и сейвпойнты правильно расставить. курсор вызывать из такой обертки.

или добавить в вере что-то типа
Код: sql
1.
AND (клок-таймстамп < current_timestamp + $timout OR pg_cancel_backend(.....<self>.... )


что не гарантирует, ибо до вере может в общем случае не добраться
...
Рейтинг: 0 / 0
Таймаут open cursor for execute
    #39659162
sKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq, спасибо, буду думать...

А по какой причине в СУБД нет таймаута на execute? Это архитектурное ограничение?
...
Рейтинг: 0 / 0
Таймаут open cursor for execute
    #39659189
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sKotqwwq, спасибо, буду думать...

А по какой причине в СУБД нет таймаута на execute? Это архитектурное ограничение?

пачиму нэт, слюшай

ви жэ сам сказал -- "усё нэ вариант"
вот вам гамак и лижи предлагаем


а как стадартный стейтмент таймаут прикрутить, "но нэ атслэживат с клиента" -- думайте сами
...
Рейтинг: 0 / 0
Таймаут open cursor for execute
    #39659215
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sKotqwwq, спасибо, буду думать...

А по какой причине в СУБД нет таймаута на execute? Это архитектурное ограничение?

Есть timeout на запрос.
begin;
set local statement_timeout to '1s';
select pg_sleep(10);
abort;

postgres=# begin;
BEGIN
postgres=# set local statement_timeout to '1s';
SET
postgres=# select pg_sleep(10);
ERROR: canceling statement due to statement timeout
postgres=# abort;
ROLLBACK

Можно и без клиента. Но будет влиять на выполнение всей вашей хранимки а не на 1 кусок.


--
Maxim Boguk
dataegret.ru
...
Рейтинг: 0 / 0
Таймаут open cursor for execute
    #39663006
sKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Максим, спасибо!

Правильно ли я понимаю, что
Код: sql
1.
set local statement_timeout to '<Таймаут>';

будет действовать только на транзакцию, начатую на клиенте командой "begin" и заканчивающуюся также на клиенте в этой же сессии командой "end"?

Т.е., если я хочу, чтобы ХП получения лога отвалилась через 10 сек, то из клиента я её должен вызывать запросом:
Код: sql
1.
2.
3.
4.
begin
	set statement_timeout=10;
	select * from <Схема>.get_log();
end;


Правильно?
...
Рейтинг: 0 / 0
Таймаут open cursor for execute
    #39663259
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sKotМаксим, спасибо!

Правильно ли я понимаю, что
Код: sql
1.
set local statement_timeout to '<Таймаут>';

будет действовать только на транзакцию, начатую на клиенте командой "begin" и заканчивающуюся также на клиенте в этой же сессии командой "end"?

Т.е., если я хочу, чтобы ХП получения лога отвалилась через 10 сек, то из клиента я её должен вызывать запросом:
Код: sql
1.
2.
3.
4.
begin
	set statement_timeout=10;
	select * from <Схема>.get_log();
end;


Правильно?

1 - да
2 - лучше через set local всетаки а то он глобальным в сессии останется установлен а это не то что вам надо.

--
Maxim Boguk
dataegret.ru
...
Рейтинг: 0 / 0
Таймаут open cursor for execute
    #39663811
sKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Максим, большое спасибо!
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Таймаут open cursor for execute
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]