Eu tenho um script PHP que escuta o NOTIFY acionado por um gatilho do PostgreSQL. Quando meu script "ouve" a notificação ele executa outros comandos dentro deste loop, como SELECT, UPDATE, DELETE, etc...
Eg.: $conn->exec('LISTEN "notify_hello"');
while (1) {
$result = "";
// wait for one Notify 10seconds instead of using sleep(10)
$result = $conn->pgsqlGetNotify(PDO::FETCH_ASSOC, 10000);
if ( $result ) {
$stmt = $conn->prepare ( 'SELECT * FROM table' );
...
}
...
}
Minha dúvida não está relacionada à programação ou como usar LISTEN
, mas diretamente com o banco de dados.
Atualmente aproveito a conexão já aberta com o banco de dados para realizar as demais operações DQL/DML dentro do loop, minha dúvida é se posso usar essa conexão já aberta, pois teoricamente ela está ocupada monitorando as notificações do NOTIFY
recurso do PostgreSQL ou se Devo criar uma nova conexão sempre que executar um comando DQL/DML e encerrá-los após a operação que realizei?
Não há problema com sua abordagem atual, desde que você esteja satisfeito com um único thread executando as solicitações uma após a outra. Você não perderá uma notificação só porque ela chega enquanto você está executando alguma instrução SQL.
Se você quiser que vários threads executem as solicitações simultaneamente, você pode iniciar uma nova conexão e um novo thread para isso. No entanto, é um desperdício abrir uma conexão de banco de dados apenas para uma única solicitação. Uma solução melhor seria ter vários trabalhadores, cada um com sua conexão de banco de dados, e você atribuir a tarefa a algum trabalhador que esteja ocioso no momento.