1 S postgres 5038 876 0 80 0 - 11962 sk_wai 09:57 ? 00:00:00 postgres: postgres my_app ::1(45035) idle
1 S postgres 9796 876 0 80 0 - 11964 sk_wai 11:01 ? 00:00:00 postgres: postgres my_app ::1(43084) idle
Eu vejo muitos deles. Estamos tentando consertar nosso vazamento de conexão. Enquanto isso, queremos definir um tempo limite para essas conexões ociosas, talvez no máximo 5 minutos.
postgresql
database-connection
user1012451
fonte
fonte
socketTimeout
do doc parece que isso fecha totalmente a conexão com o banco de dados. Estou tentando fechar cada inativo, e o contador inicia assim que a conexão é estabelecida.<IDLE> in transaction
sessões, deixando a sessão em execução, mas no<IDLE>
estado? Em outras palavras, encerrar a transação, mas não a sessão? (Votação negativa: pergunta pouco clara)idle
para sempre, estamos perguntando se poderíamos definir um tempo limite em cada conexão / sessão (honestamente, não sei a terminologia correta, desculpe). Se uma transação leva 5 minutos para um aplicativo da web normal, algo deve estar errado ....Respostas:
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 ostate
campo depg_stat_activity
para implementar um reaper de conexão inativo. Faça um cron job executar algo assim:Em versões anteriores, você precisa implementar esquemas complicados que controlam quando a conexão fica inativa. Nao ligue; basta usar o pgbouncer.
fonte
idle
. por que devo fechá-lo.No PostgreSQL 9.6, há uma nova opção
idle_in_transaction_session_timeout
que deve cumprir o que você descreve. Você pode defini-lo usando oSET
comando, por exemplo:fonte
SET SESSION
é apenas para a sessão atual (ela voltará ao padrão assim que você abrir uma nova conexão). Você também pode definir parâmetros de configuração em um nível de banco de dados usandoALTER DATABASE SET idle_in_transaction_session_timeout = '5min'
, por exemplo , ou usando arquivos de configuração (consulte postgresql.org/docs/current/static/config-setting.html ).No PostgreSQL 9.1, as conexões inativas com a consulta a seguir. Isso me ajudou a evitar a situação que justificava o reinício do banco de dados. Isso acontece principalmente com conexões JDBC abertas e não fechadas corretamente.
fonte
se você estiver usando postgresql 9.6+, então em seu postgresql.conf você pode definir
idle_in_transaction_session_timeout = 30000
(mseg)fonte
Uma possível solução alternativa que permite habilitar o tempo limite da sessão do banco de dados sem uma tarefa externa agendada é usar a extensão pg_timeout que desenvolvi.
fonte