我们在RDS中设置了Postgres数据库。我写了一些API来使用Spring Boot处理数据提取到数据库。最近我发现很多连接在调用API后保持会话活动。有些会议可追溯到3个月前。
我想知道是否有一种方法可以在一段时间处于非活动状态后自动关闭这些连接。从How to close idle connections in PostgreSQL automatically?开始,我可以设置一个cron作业来查找与SQL查询的死连接,并使用pg_trminate_backend
终止它们。这是最好的选择吗?是否可以在Web应用程序层中完成某些操作?或者可能是一些RDS参数?需要一些建议。
答案 0 :(得分:4)
从9.6开始,你有:
https://www.postgresql.org/docs/current/static/runtime-config-client.html
idle_in_transaction_session_timeout
(整数)使用已空闲的已打开事务终止任何会话 超过指定的持续时间(以毫秒为单位)。这允许任何 该会话持有的锁被释放,连接槽被释放 被重用;它还允许仅对此事务可见的元组 被吸尘。有关此内容的更多详细信息,请参见第24.1节。
默认值0禁用此功能。
(格式化我的)
在9.6之前 - 是唯一的原生方式 - 使用SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE now()-state_change > '5 minute'::interval
的cron。
如果您使用 pgbouncer 的连接池,则:
https://pgbouncer.github.io/config.html
server_idle_timeout
如果服务器连接空闲多于 它会被丢弃多少秒。如果为0则禁用超时。 [秒]默认值:600.0
(格式化我的)