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.