Функции статуса асинхронного запроса доступны только в одном сеансе? - PullRequest
0 голосов
/ 05 октября 2018

Моя цель состояла в том, чтобы веб-служба запустила асинхронный запрос, используя следующий механизм:

select dblink_connect('asyncconnect', 'host=localhost port=5432 dbname=mydb user=theking password=pass');  
select dblink_send_query('asyncconnect', 'perform pg_sleep(60)); --represents som elong running query/function

После запуска этого процесса я захотел вернуться позже и проверитьего прогресс в новом клиентском экземпляре с использованием следующего вызова:

SELECT * from dblink_is_busy('asyncconnect');

Однако это не работает, вместо этого я получаю сообщение об ошибке:

ОШИБКА: соединение "asyncconnect" недоступно.

Это несмотря на то, что асинхронный запрос из начальной отправки все еще выполняется.

Кроме того, если я попробую этот запрос:

select * from dblink_get_connections()

Ничего не возвращается.

Это можно воссоздать, запустив описанный выше сценарий с двумя разными клиентами PostgreSQL: я использовал dbeaver для подключения и отправки первого рабочего запроса и sqlworkbench, чтобы попытаться получить статус запроса.Очевидно, они оба подключены к одному и тому же серверу и БД.

Теперь, если я выполню все на одном клиенте, тогда все будет работать как положено.

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

Разве это не так в отношении PostgreSQL?

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

1 Ответ

0 голосов
/ 05 октября 2018

Соединение dblink доступно только в сеансе базы данных, в котором оно было создано.

Так что да, вам придется использовать другую технику, как вы это делаете в своем обходном пути.В этом случае вам вообще не нужен dblink.Это просто не инструмент для того, что вы хотите.

...