如何自动关闭PostgreSQL中的空闲连接?

2023-12-01

一些客户端连接到我们的 postgresql 数据库,但保持连接打开。 是否可以告诉 Postgresql 在一定时间不活动后关闭这些连接?

TL;DR

如果您使用的是 Postgresql 版本 >=9.2
然后使用我想出的解决方案

如果你不想写任何代码
然后使用arqnid 的解决方案

如果你不想写任何代码
并且您使用的是 Postgresql 版本 >=14
然后使用劳伦兹·阿尔伯的解决方案


对于那些感兴趣的人,这是我提出的解决方案,灵感来自克雷格·林格的评论:

(...) 使用 cron 作业查看连接上次活动的时间(请参阅 pg_stat_activity)并使用 pg_terminate_backend 终止旧连接。(...)

所选择的解决方案如下:

  • 首先,我们升级到 Postgresql 9.2。
  • 然后,我们安排一个线程每秒运行一次。
  • When the thread runs, it looks for any old inactive connections.
    • 考虑连接inactive if its state或者是idle, idle in transaction, idle in transaction (aborted) or disabled.
    • 考虑连接old if its state5分钟多时间里保持不变。
  • 还有其他线程执行与上面相同的操作。但是,这些线程使用不同的用户连接到数据库。
  • 我们为连接到我们数据库的任何应用程序保留至少一个打开的连接。 (rank()功能)

这是线程运行的 SQL 查询:

WITH inactive_connections AS (
    SELECT
        pid,
        rank() over (partition by client_addr order by backend_start ASC) as rank
    FROM 
        pg_stat_activity
    WHERE
        -- Exclude the thread owned connection (ie no auto-kill)
        pid <> pg_backend_pid( )
    AND
        -- Exclude known applications connections
        application_name !~ '(?:psql)|(?:pgAdmin.+)'
    AND
        -- Include connections to the same database the thread is connected to
        datname = current_database() 
    AND
        -- Include connections using the same thread username connection
        usename = current_user 
    AND
        -- Include inactive connections only
        state in ('idle', 'idle in transaction', 'idle in transaction (aborted)', 'disabled') 
    AND
        -- Include old connections (found with the state_change field)
        current_timestamp - state_change > interval '5 minutes' 
)
SELECT
    pg_terminate_backend(pid)
FROM
    inactive_connections 
WHERE
    rank > 1 -- Leave one connection for each application connected to the database
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何自动关闭PostgreSQL中的空闲连接? 的相关文章

随机推荐

  • Python:Eclipse 中 PyDev 中 sqlite3 未解决的导入错误

    导入 sqlite3 生成 Unused import sqlite3 Unresolved import sqlite3 sqlite3 Found at DatabaseTests import sqlite3 然而 当使用 pytho
  • firebase云功能是否涉及实时数据库和firestore的成本?

    每当更新 Firestore 文档时 我都会运行云函数 该函数读取文档 获取用户 ID 然后从实时数据库中获取用户令牌 ID 并发送通知 因此 我们在这里读取了 1 个文档 以及一些与实时数据库读取相关的下载开销 我的问题是 如果云函数读取
  • R中数据帧中低频数据过滤的有效方法

    我有一个包含几列的 data frame 想要根据变量的组合过滤低频数据 这个例子就像性别变量中的男性 女性和胆固醇变量中的高 低 那么我的数据框将是这样的 set seed 123 Sex sample c Male Female siz
  • XMLUNIT 忽略 xmlns?

    尝试获取这两个类似的 XML 想要忽略 xmlns 和不同的元素序列 但对我来说无法正常工作 如果删除 xmlns 则 doc 是 simmilr 我正在使用 XMlUnit 1 5 String s1
  • 复制带有格式的文本 - iOS 6 NSAttributedString 到粘贴板

    如何以编程方式复制格式化文本 例如italic 来自 UITextView 这样当粘贴到另一个程序 例如邮件 时 格式将被保留 我假设正确的方法是将 NSAttributedString 复制到粘贴板 现在 我可以通过以下方式将常规字符串复
  • 带有 标记的数组类型不适用于 Swagger (swashbuckle.aspnetcore)

    我正在使用 swagger 文档的摘要和示例标签 我的标签有问题 当我使用 array 时 swagger 无法识别它 我使用 swashbuckle aspnetcore 包 Nuget 例子 DataContract public cl
  • 在 R 中绘制世界地图

    我正在尝试使用 R 可视化世界地图上国家 地区的一些数据ggplot2 我正在使用以下代码 示例 WorldData lt map data world df lt data frame region c Hungary Lithuania
  • sqlite 中的十六进制文字太大

    所以我想将 mysql 查询转换为 sqlite 其中有十六进制代码的图像 当我在 sqlite 浏览器中运行相同的查询时 它给了我一个错误 正确的方法是什么 Result hex literal too big 0x73616666726
  • 无法从另一个板条箱导入模块 - 未解决的导入

    我正在尝试写一个名为bar 结构看起来像这样 src bar rs lib rs My src lib rs看起来像这样 crate type lib crate name bar feature ip addr allow dead co
  • 在 Windows 上连接 Jenkins 代理失败并出现连接超时

    在 Windows 上连接 Jenkins 代理失败 并出现连接超时 环境 Windows 服务器 2003 R2 Java6 硕士 Linux 从属 Windows 我尝试将它作为 jnlp 和 java jar cmd 运行 但它始终失
  • 清单合并失败:Android Studio

    我不确定出了什么问题 我用谷歌搜索了一下 虽然这是关于匹配 sdk 版本的 它们的作用相同 如下 构建 gradle android compileSdkVersion 17 buildToolsVersion 19 0 1 default
  • 在MySQL中获取一个人的年龄

    我怎样才能在mysql中获得一个人的年龄 想象一下我有一张桌子member id member month member year现在我需要获取会员的年龄Months Say member month 1 and member year 2
  • 尝试捕获信号量的正确方法

    将信号量操作包装在 try catch 块中的正确方法是什么 如果获取操作在获取一定数量 但不是全部 请求的许可后被中断 会发生什么情况 你怎么知道要再次释放多少个 发布是否应该在 最终 块中进行 但是如果操作被中断 您是否可能会发布未获得
  • 使用变量时在 Excel 中通过 VBA 设置验证失败

    我正在尝试使用 VBA 设置一系列单元格的数据验证 我使用此代码收到运行时错误 1004 非常有用 应用程序定义或对象定义错误 With rngRangeToCheck Cells lrownum 1 Validation Delete A
  • 如何使用 Selenium ChromeDriver 和 Chrome 在自定义位置下载文件

    我想将 txt 和 pdf 文件下载到特定文件夹 但它只是将它们下载到另一个文件夹中 网站http demo automationtesting in FileDownload html 代码有问题还是我没有放置正确的文件夹位置 impor
  • 在 WooCommerce 中删除或隐藏“wc_add_notice”消息

    我用它来删除 WooCommerce 中的 购物车已更新 消息 add filter woocommerce add message return false 但仍显示 运费已更新 消息 我怎样才能删除这条消息 根据您的具体情况 在短代码
  • UITableView 的问题:继续收到此运行时错误无法识别的选择器

    我有这个错误 它阻碍了我前进 我基本上有一个应用程序 其中包含一个指向各个 UIViewController 的 UITabViewController 所以其中一个选项卡 我想实现一个基本的 TableViewController 现在
  • 用于运行 VSCode 扩展的自定义节点版本

    我正在制作一个 vscode 扩展供我个人使用 我真的很想使用更新的节点版本 但是 我不确定 VSCode 如何选择要使用的节点版本 我安装的唯一的node js是8 1 3 但是当我调试扩展时 我看到 VSCode 使用7 via pro
  • 在 yii 中使用 url 管理器将 url 更改为 seo 友好

    我如何将这些 URL 转换为 SEO 友好的 URL 我在 yii 中尝试了 Url manager 但没有得到正确的结果是否有关于 url manager 的好的教程 http localhost nbnd search city cit
  • 如何自动关闭PostgreSQL中的空闲连接?

    一些客户端连接到我们的 postgresql 数据库 但保持连接打开 是否可以告诉 Postgresql 在一定时间不活动后关闭这些连接 TL DR 如果您使用的是 Postgresql 版本 gt 9 2然后使用我想出的解决方案 如果你不