如何在 Amazon RDS 中关闭与 Postgres DB 的空闲连接
Posted
技术标签:
【中文标题】如何在 Amazon RDS 中关闭与 Postgres DB 的空闲连接【英文标题】:How to shut down idle connections to Postgres DB in Amazon RDS 【发布时间】:2018-06-21 11:01:05 【问题描述】:我们在 RDS 中设置了 Postgres 数据库。我编写了一些 API 来使用 Spring Boot 处理对数据库的数据摄取。最近我发现很多连接在调用 API 后仍然保持会话活跃。一些会议可以追溯到 3 个月前。
我想知道是否有办法在这些连接处于非活动状态一段时间后自动关闭这些连接。从How to close idle connections in PostgreSQL automatically? 看来,我可以设置一个cron 作业来查找带有SQL 查询的死连接并使用pg_trminate_backend
终止它们。这是最好的选择吗? Web应用层有什么可以做的吗?或者可能是一些 RDS 参数?在这方面需要一些建议。
【问题讨论】:
【参考方案1】:从 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
(格式化我的)
【讨论】:
我将idle_in_transaction_session_timeout
设置为 60 秒。不过,它似乎不会影响任何闲置 2 个月的会话。不得不手动终止这些遗留会话。希望它适用于将来空闲的新会话。
你可以通过打开连接并且两分钟不运行任何查询来检查它以上是关于如何在 Amazon RDS 中关闭与 Postgres DB 的空闲连接的主要内容,如果未能解决你的问题,请参考以下文章