PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Existe um tempo limite para conexões ociosas do PostgreSQL?


Parece que você tem um vazamento de conexão em seu aplicativo porque falha ao fechar conexões em pool . Você não está tendo problemas apenas com <idle> in transaction sessões, mas com muitas conexões em geral.

Matar conexões não é a resposta certa para isso, mas é uma solução temporária OK.

Em vez de reiniciar o PostgreSQL para inicializar todas as outras conexões de um banco de dados PostgreSQL, consulte:Como desanexar todos os outros usuários de um banco de dados postgres? e Como descartar um banco de dados PostgreSQL se houver conexões ativas com ele? . O último mostra uma consulta melhor.

Para definir tempos limite, como @Doon sugeriu, veja Como fechar conexões ociosas no PostgreSQL automaticamente?, que aconselha a usar o PgBouncer para fazer proxy do PostgreSQL e gerenciar conexões ociosas. Esta é uma idéia muito boa se você tiver um aplicativo com bugs que vaza conexões de qualquer maneira; Eu muito fortemente recomendo configurar o PgBouncer.

Um keepalive TCP não fará o trabalho aqui, porque o aplicativo ainda está conectado e ativo, simplesmente não deveria estar.

No PostgreSQL 9.2 e acima, você pode usar o novo state_change coluna timestamp e o state campo de pg_stat_activity para implementar um reaper de conexão ocioso. Faça um cron job executar algo assim:
SELECT pg_terminate_backend(pid)
    FROM pg_stat_activity
    WHERE datname = 'regress'
      AND pid <> pg_backend_pid()
      AND state = 'idle'
      AND state_change < current_timestamp - INTERVAL '5' MINUTE;

Em versões mais antigas, você precisa implementar esquemas complicados que controlam quando a conexão ficou ociosa. Nao ligue; basta usar pgbouncer.