Моя цель состояла в том, чтобы веб-служба запустила асинхронный запрос, используя следующий механизм:
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?
Я нашел обходной путь, имеядлительный процесс отправляет свое состояние в таблицу, которую я могу затем запросить, но кажется, что предоставленные функции статуса должны работать.