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
Veo muchos de ellos. Estamos tratando de arreglar nuestra fuga de conexión. Pero mientras tanto, queremos establecer un tiempo de espera para estas conexiones inactivas, tal vez como máximo de 5 minutos.
postgresql
database-connection
usuario1012451
fuente
fuente
socketTimeout
desde el documento parece que esto cierra la conexión a la base de datos, por completo. Estoy tratando de cerrar cada inactividad y el contador comienza tan pronto como se establece la conexión.<IDLE> in transaction
sesiones y dejar la sesión en ejecución pero en<IDLE>
estado? En otras palabras, ¿terminar la transacción pero no la sesión? (Votación en contra: pregunta poco clara)idle
para siempre, preguntamos si podemos establecer un tiempo de espera en cada conexión / sesión (sinceramente, no conozco la terminología correcta, lo siento). Si una transacción toma 5 minutos para una aplicación web normal, algo debe estar mal ....Respuestas:
Parece que tiene una fuga de conexión en su aplicación porque no cierra las conexiones agrupadas . No tiene problemas solo con las
<idle> in transaction
sesiones, sino con demasiadas conexiones en general.Matar conexiones no es la respuesta correcta para eso, pero es una solución temporal aceptable.
En lugar de reiniciar PostgreSQL para arrancar todas las demás conexiones desde una base de datos PostgreSQL, consulte: ¿Cómo desconecto a todos los demás usuarios de una base de datos de Postgres? y ¿Cómo eliminar una base de datos PostgreSQL si hay conexiones activas a ella? . Este último muestra una mejor consulta.
Para configurar tiempos de espera, como sugirió @Doon, consulte ¿Cómo cerrar conexiones inactivas en PostgreSQL automáticamente? , que le aconseja utilizar PgBouncer como proxy para PostgreSQL y administrar las conexiones inactivas. Esta es una muy buena idea si tiene una aplicación con errores que de todos modos pierde conexiones; Recomiendo encarecidamente configurar PgBouncer.
Un keepalive de TCP no hará el trabajo aquí, porque la aplicación todavía está conectada y viva, simplemente no debería estarlo.
En PostgreSQL 9.2 y superior, puede usar la nueva
state_change
columna de marca de tiempo y elstate
campo depg_stat_activity
para implementar un reaper de conexión inactiva. Haga que un trabajo cron ejecute algo como esto:En versiones anteriores, debe implementar esquemas complicados que realicen un seguimiento de cuándo la conexión quedó inactiva. No molestar; solo usa pgbouncer.
fuente
idle
. ¿Por qué debería cerrarlo?En PostgreSQL 9.6, hay una nueva opción
idle_in_transaction_session_timeout
que debería lograr lo que describe. Puede configurarlo usando elSET
comando, por ejemplo:fuente
SET SESSION
es solo para la sesión actual (volverá al valor predeterminado una vez que abra una nueva conexión). También puede establecer parámetros de configuración a nivel de base de datos usandoALTER DATABASE SET idle_in_transaction_session_timeout = '5min'
, por ejemplo , o usando archivos de configuración (consulte postgresql.org/docs/current/static/config-setting.html ).En PostgreSQL 9.1, las conexiones inactivas con la siguiente consulta. Me ayudó a evitar la situación que justificaba reiniciar la base de datos. Esto ocurre principalmente con conexiones JDBC abiertas y no cerradas correctamente.
fuente
si está utilizando postgresql 9.6+, entonces en su postgresql.conf puede configurar
idle_in_transaction_session_timeout = 30000
(mseg)fuente
Una posible solución que permite habilitar el tiempo de espera de la sesión de la base de datos sin una tarea programada externa es usar la extensión pg_timeout que he desarrollado.
fuente