Parece que há um vazamento de conexão em seu aplicativo porque ele não fecha as conexões em pool . Você não está tendo problemas apenas com as <idle> in transaction
sessões, mas com muitas conexões no geral.
Eliminar conexões não é a resposta certa para isso, mas é uma solução temporária OK-ish.
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 para ele? . Este último mostra uma consulta melhor.
Para definir o tempo limite, como @Doon sugeriu, consulte Como fechar conexões ociosas no PostgreSQL automaticamente? , que o aconselha a usar o PgBouncer como proxy para PostgreSQL e gerenciar conexões inativas. Essa é uma idéia muito boa se você tiver um aplicativo com erros que vaza conexões de qualquer maneira; Eu recomendo fortemente configurar o PgBouncer.
Um keepalive TCP não fará o trabalho aqui, porque o aplicativo ainda está conectado e ativo, mas não deveria estar.
No PostgreSQL 9.2 e superior, você pode usar a nova state_change
coluna timestamp e o state
campo de pg_stat_activity
para implementar um reaper de conexão inativo. 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 anteriores, você precisa implementar esquemas complicados que controlam quando a conexão fica inativa. Nao ligue; basta usar o pgbouncer.