有没有办法可以在不设置服务器上的情况下保持 pgAdmin 中的连接处于活动状态?

有没有办法可以在不设置服务器上的情况下保持 pgAdmin 中的连接处于活动状态?

我使用 postgres.heroku.com 来托管我的数据库。这意味着我无法更改服务器设置。因此,问题对我没有帮助。Heroku 不愿意更改他们的设置(我已经联系过他们)。

我想知道破解 PgAdmin III 以保持连接的最佳方法是什么。我正在考虑创建一个 Autohotkey 宏来在 PgAdmin 处于后台时自动执行用户界面操作,或者使用某种网络工具强制代表 PgAdmins 发送网络消息。

我还收到过有人出价 500 美元,希望他能修改 PgAmin III 的代码。PgAdmin 的开发人员不会修改代码,只因为 Heroku。

我该怎么办?PgAdmin 在很多方面都很出色,但它只是有这个缺点。

答案1

libpq,底层 PostgreSQL 客户端库,可以keepalives选择启用 TCP keepalive

看起来 PgAdmin-III 不允许您直接指定任意连接参数,但有一种解决方法。

当你在 PgAdmin-III 中查看连接配置时,你会看到一个“服务”选项。这指的是连接服务文件。要使用它,请创建一个~/.pg_service.conf内容如下:

[myherokudb]
user=myusername
keepalives=1
connect_timeout=20
keepalives_idle=10

当从 PgAdmin-III 连接时,请在字段myherokudb中输入service

这将导致 PgAdmin-III 使用服务文件中指定的连接参数,包括启用 keepalives。

(如果您使用的是 Windows,服务文件可能位于其他位置;请参阅文档)。

没有环境变量来libpq控制 keepalive,因此您无法通过这种方式进行设置,而必须使用服务文件。

为 PgAdmin-III 添加对其他连接参数的支持,或在连接选项中添加一个复选框来控制 keepalives 参数,应该很简单。我想知道 Dave 是否明白你要求资助这项工作的原因。


更新:服务文件在环境变量中指定的位置查找PGSYSCONFDIR。如果未设置,则默认为特定于平台的位置,这似乎没有为 Windows 正确记录。我会提交文档补丁。文档.pgpass显示它的路径好像%APPDATA%\postgresql\pgpass.conf应该~/.pg_service.conf是这样%APPDATA%\postgresql\pg_service.conf......但似乎并非如此。

其实正确的路径是:

%APPDATA%\postgresql\.pg_service.conf

所以:

  • 开始->运行
  • `%APPDATA%
  • 如果目录“postgresql”不存在,则创建它
  • 创建文件“ .pg_service.conf”作为文本文件,内容如上所述(请参阅下面关于文件命名的注释)
  • 在PgAdmin-III中,在主机名中输入“localhost”,在服务字段中输入服务名称。

我在 Windows 上进行了测试,发现在 Windows 上您不能将hostPgAdmin-III 中的字段留空。PgAdmin-III 似乎会用连接对话框中指定的内容覆盖服务文件中指定的任何主机。因此您不应该host在服务文件中包含密钥。(我会报告错误)。

在 Windows 中关闭“隐藏已知文件类型的文件扩展名”,这样您就不会意外地调用它.pg_service.conf.txt。如果您不确定它的名称是否正确,请在列表视图中检查 Windows 资源管理器中的“类型”列;如果它的名称不正确,它将显示“文本文档”,.pg_service.conf.txt如果CONF File它的名称正确.pg_service.conf。如果您在重命名时遇到问题,请关闭“隐藏已知文件类型的文件扩展名”,或使用合理的文本编辑器,例如记事本++这样您就可以创建任意名称的文件。

请注意文件名中的前导句点(点)。是的,这与 不同pgpass.conf,是的,这很烦人,接近于错误。

答案2

只需在数据库上执行以下命令即可完成。

ALTER ROLE user_name_here IN DATABASE database_name_here SET tcp_keepalives_idle TO '30';

相关内容