【问题标题】:PostgreSQL: Session Timeout?PostgreSQL:会话超时?
【发布时间】:2011-06-30 12:22:33
【问题描述】:

我正在寻找一种方法来控制 PGSQL (9.0) 客户端 (Windows) 的会话超时。

会话何时死亡?他们死后发生了什么。

如何强制会话终止? (例如它被“锁定”了,在一些错误的长查询上,我想强制服务器释放资源)。

谢谢你: dd


我对此进行了扩展以理解它: 数据库需要知道哪个会话已死。 必须释放死会话,因为它只是持有资源,如果这个操作没有完成,我们应该得到很多锁,或者我们可以超出可用连接(达到最大值)。

其他数据库(FireBird、EDB)为其定义了 TimeOut 参数。

当它到达时,会话设置为死,用户连接中止。

为了避免筋疲力尽,您需要定期做一些事情,以延长时间。

有 3 种方法可以达到超时: 1.) 客户端程序挂起、冻结或关闭。 2.) 网络连接断开 3.) 客户端发送一些很长的查询/存储过程,但没有完成。

如果超时未由服务器处理,可能某人的事务、锁等仍然存在 X 小时,您必须只有一种方法来删除它:重新启动 db 服务器服务。

其他数据库处理死会话,因为它们不再与服务器交互,因此客户端出现错误,需要重新启动客户端软件。

部分数据库支持返回“非活动”但“未死”的会话,可以继续工作。

所以,有了这个序言,我再次提出我的问题:

  1. 如何在pgsql下控制客户端的会话超时?系统变量、SQL 参数等?
  2. 如何延长此时间?
  3. 如果长查询耗尽了时间会发生什么?
  4. pgsql服务器什么时候释放客户端持有的资源?

谢谢: dd

【问题讨论】:

  • 我不知道 Postgres 中有这样的设置。对我来说,这听起来你最好修复应用程序中的连接处理。我能想到的唯一“解决方案”是使用位于应用程序和数据库之间的连接池(如 pg-pool 或 pgBouncer)。由于它充当代理,因此应用程序不会意识到这一点。

标签: delphi session postgresql timeout


【解决方案1】:

我不明白你问题的第一部分,但要终止正在运行的会话,你可以使用pg_terminate_backend()

要终止正在运行的会话的查询,请使用pg_cancel_query()

这两个功能在手册中都有解释:

http://www.postgresql.org/docs/current/static/functions-admin.html#FUNCTIONS-ADMIN-SIGNAL-TABLE

【讨论】:

    【解决方案2】:

    有 3 种方法可以达到超时:1.) 客户端程序挂起、冻结或关闭。 2.) 网络连接中断 3.) 客户端发送一些很长的查询/存储过程,但没有完成。

    对于 2,tcp_keepalives_* 设置可能有用:http://www.postgresql.org/docs/8.4/static/runtime-config-connection.html

    对于 3,有一个 statement_timeout 设置:http://www.postgresql.org/docs/8.4/static/runtime-config-client.html,但这只会终止语句,而不是连接。

    【讨论】:

      猜你喜欢
      • 2010-12-05
      • 2010-12-25
      • 2015-10-10
      • 2013-07-04
      • 2011-01-15
      相关资源
      最近更新 更多