【发布时间】:2011-06-30 12:22:33
【问题描述】:
我正在寻找一种方法来控制 PGSQL (9.0) 客户端 (Windows) 的会话超时。
会话何时死亡?他们死后发生了什么。
如何强制会话终止? (例如它被“锁定”了,在一些错误的长查询上,我想强制服务器释放资源)。
谢谢你: dd
我对此进行了扩展以理解它: 数据库需要知道哪个会话已死。 必须释放死会话,因为它只是持有资源,如果这个操作没有完成,我们应该得到很多锁,或者我们可以超出可用连接(达到最大值)。
其他数据库(FireBird、EDB)为其定义了 TimeOut 参数。
当它到达时,会话设置为死,用户连接中止。
为了避免筋疲力尽,您需要定期做一些事情,以延长时间。
有 3 种方法可以达到超时: 1.) 客户端程序挂起、冻结或关闭。 2.) 网络连接断开 3.) 客户端发送一些很长的查询/存储过程,但没有完成。
如果超时未由服务器处理,可能某人的事务、锁等仍然存在 X 小时,您必须只有一种方法来删除它:重新启动 db 服务器服务。
其他数据库处理死会话,因为它们不再与服务器交互,因此客户端出现错误,需要重新启动客户端软件。
部分数据库支持返回“非活动”但“未死”的会话,可以继续工作。
所以,有了这个序言,我再次提出我的问题:
- 如何在pgsql下控制客户端的会话超时?系统变量、SQL 参数等?
- 如何延长此时间?
- 如果长查询耗尽了时间会发生什么?
- pgsql服务器什么时候释放客户端持有的资源?
谢谢: dd
【问题讨论】:
-
我不知道 Postgres 中有这样的设置。对我来说,这听起来你最好修复应用程序中的连接处理。我能想到的唯一“解决方案”是使用位于应用程序和数据库之间的连接池(如 pg-pool 或 pgBouncer)。由于它充当代理,因此应用程序不会意识到这一点。
标签: delphi session postgresql timeout