2015-08-28 3 views
0

Для эффективности и не использовать пул PostgreSQL я хочу выполнить некоторые запросы и не дожидаться их ответа или сбоя. 100% запросов - это тяжелые отказоустойчивые функции (внутренняя ошибка), которые возвращают VOID, и я хочу иметь возможность выполнять многие, не ожидая ответа на бесплатное соединение с пулом, потому что ответы всегда будут равны нулю, поскольку все эти процедуры всегда возвращают VOID.Node.js (node-pg) или C (libpq) - выполнить запрос PostgreSQL без ожидания ответа?

Какие у меня варианты? Я открыт для разных решений.

Мне даже было интересно, если бы просто нарисовать PERFORM myProcedure(), он просто сработает, так как функция не ожидает возврата.

Будет ли этот механизм libpq работать, если я никогда не получу ответ? или он вместо этого блокирует весь мой пул, потому что я никогда не получал нули. http://www.postgresql.org/docs/9.4/static/libpq-async.html

+0

Это гипотетический вопрос или у вас заканчиваются соединения в бассейне? Если это первый, то я бы не стал беспокоиться, это происходит только тогда, когда что-то не так в вашем дизайне и/или реализации. –

ответ

1

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

Это поддерживается протоколом PostgreSQL. Некоторые клиентские драйверы, включая libpq и PgJDBC, поддерживают асинхронные запросы. Тем не менее, единственным драйвером, который мне известен, который поддерживает конвейерную обработку, является PgJDBC, и он не поддерживает конвейерную обработку для отдельных запросов, а только запросы в пакетном запуске через executeBatch.

Чтобы использовать асинхронный механизм libpq для выполнения необходимых действий, вам понадобится пул соединений (поскольку он не может конвейер на одном соединении), и вам нужно периодически проверять, завершен ли запрос по соединению. Вы не можете запускать и забывать, и нет механизма обратного вызова для доработок. Что-то вроде цикла epoll для проверки нового ожидающего ввода сделало бы, и похоже, что это будет хорошо подходит для модели, управляемой событиями node.js.

Было обсуждено добавление конвейерного асинхронного режима к libpq, где запросы возвращают будущий объект, и вы можете проверить, заполнен ли объект результата и/или ждать на нем, а также отправлять больше запросов. Ничего не было реализовано AFAIK. Возможно, вы захотите принять участие. Технически это не так сложно, и в основном речь идет не о том, чтобы люди, которые этого достаточно, чтобы помочь реализовать его. Говорите на pgsql-хакерах.

Мне даже было интересно, если бы просто набрав PERFORM myProcedure(), он просто сработал бы с тех пор, как ожидается, что нет возврата.

№ Это все еще ждет. Он должен знать, была ли ошибка или нет, и последующему коду также разрешено ожидать, что любые побочные эффекты процедуры будут завершены.

Для узлов-Postgres см:

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

Итак, я либо использовал бы пул соединений с libpq с использованием асинхронных запросов, так и цикл epoll, или я бы использовал node-postgres.

+0

Итак, что вы имеете в виду, что нет возможности запросить элемент без блокировки пула? как насчет внутри самого SQL? ... нет команды pgsql, которую я мог бы запустить, чтобы я мог просто вернуться без ожидания, например. http://pastie.org/10380701 – Onza

+0

В PostgreSQL нет средства для запуска асинхронных или фоновых команд на сервере. Вы должны запустить команду в соединении, а затем дождаться ее завершения, за исключением отмеченных выше репигелей pgJDBC и поддержки async libpq/pgjdbc. Во всех этих случаях соединение остается занятым и не может обслуживать другие запросы, пока ваши запросы не закончатся. –

+0

Хорошо, тогда :(спасибо – Onza