Considere a seguinte demonstração no postgres 9.6.
Fiz o seguinte nesta ordem:
Eu corri no PSQL:LISTEN foo;
Eu corri no DataGrip. NOTIFY foo,'thad man';
Voltei para o console PSQL e não vejo o meu esperado:
Asynchronous notification "foo" with payload "thad man" received from server process with PID 4117.
É somente no PSQL quando executo qualquer instrução que recebo minha notificação. Como posso ver que as notificações são feitas sem fazer nada? Isso é possível? Se eu tiver que executar uma instrução como, SELECT 1;
que benefício posso obter ao ouvir na camada do aplicativo? Eu teria que estar executando SELECT 1;
em um loop constante a cada segundo ou algo assim para ser notificado?
Um aplicativo não precisa pesquisar o banco de dados para receber notificações, mas deve pesquisar o status de seu soquete (conexão de rede) para saber que há uma notificação a ser coletada, caso contrário, não há como saber sobre isso. O psql não faz isso ao aguardar a entrada do usuário. Ele bloqueia na entrada do usuário, como a maioria dos aplicativos orientados por linha de comando.
Não, mas você precisa implementar algum tipo de loop de eventos em seu aplicativo para detectar a notificação e tratá-la. Mas nem a detecção nem o manuseio precisam enviar qualquer consulta ao servidor de banco de dados.
É assim que o "psql" funciona. Quando está esperando pelo teclado, essa é a única coisa que está esperando. Você pode imaginar o quão irritante seria se as mensagens fossem recebidas e exibidas enquanto você estivesse digitando?
Use alguma outra ferramenta, que não seja projetada principalmente para trabalho interativo. É bastante fácil fazer um script perl, por exemplo, que exibe os avisos tão rápido quanto eles chegam. Eu acho que o JDBC mais recente torna mais fácil do que costumava ser fazer isso em JAVA também. Eu ficaria surpreso se o Python não tiver uma solução, embora não me lembre de ter visto/testado uma.