То, что вы, кажется, ищет это асинхронных запросов сконвейерная. Запросы помещаются в очередь по соединению, выполняются в том порядке, в котором они отправлены, и их результаты возвращаются в порядке выполнения.
Это поддерживается протоколом PostgreSQL. Некоторые клиентские драйверы, включая libpq
и PgJDBC
, поддерживают асинхронные запросы. Тем не менее, единственным драйвером, который мне известен, который поддерживает конвейерную обработку, является PgJDBC, и он не поддерживает конвейерную обработку для отдельных запросов, а только запросы в пакетном запуске через executeBatch
.
Чтобы использовать асинхронный механизм libpq для выполнения необходимых действий, вам понадобится пул соединений (поскольку он не может конвейер на одном соединении), и вам нужно периодически проверять, завершен ли запрос по соединению. Вы не можете запускать и забывать, и нет механизма обратного вызова для доработок. Что-то вроде цикла epoll
для проверки нового ожидающего ввода сделало бы, и похоже, что это будет хорошо подходит для модели, управляемой событиями node.js.
Было обсуждено добавление конвейерного асинхронного режима к libpq
, где запросы возвращают будущий объект, и вы можете проверить, заполнен ли объект результата и/или ждать на нем, а также отправлять больше запросов. Ничего не было реализовано AFAIK. Возможно, вы захотите принять участие. Технически это не так сложно, и в основном речь идет не о том, чтобы люди, которые этого достаточно, чтобы помочь реализовать его. Говорите на pgsql-хакерах.
Мне даже было интересно, если бы просто набрав PERFORM myProcedure()
, он просто сработал бы с тех пор, как ожидается, что нет возврата.
№ Это все еще ждет. Он должен знать, была ли ошибка или нет, и последующему коду также разрешено ожидать, что любые побочные эффекты процедуры будут завершены.
Для узлов-Postgres см:
Похоже асинхронными являются по умолчанию способ делать вещи на узле. Он не будет конвейерным.
Итак, я либо использовал бы пул соединений с libpq
с использованием асинхронных запросов, так и цикл epoll
, или я бы использовал node-postgres.
Это гипотетический вопрос или у вас заканчиваются соединения в бассейне? Если это первый, то я бы не стал беспокоиться, это происходит только тогда, когда что-то не так в вашем дизайне и/или реализации. –