Delphi PostgreSQL:会话超时?
我正在寻找一种控制PGSQL(9.0)客户端(Windows)会话超时的方法 当一次会议结束时?他们死后发生了什么 我如何才能强制一个会话终止?(例如,它在某个错误的长查询中被“锁定”,我想强制服务器释放资源) 谢谢你: ddDelphi PostgreSQL:会话超时?,delphi,session,postgresql,timeout,Delphi,Session,Postgresql,Timeout,我正在寻找一种控制PGSQL(9.0)客户端(Windows)会话超时的方法 当一次会议结束时?他们死后发生了什么 我如何才能强制一个会话终止?(例如,它在某个错误的长查询中被“锁定”,我想强制服务器释放资源) 谢谢你: dd 我将此扩展以理解它: 数据库需要知道哪个会话已死亡。 死会话必须被释放,因为它只保存资源,如果这个操作没有完成,我们应该获得很多锁,否则我们可能会失去可用的连接(达到最大值) 其他数据库(FireBird、EDB)为其定义超时参数 到达时,会话设置为死,用户连接中止 为
我将此扩展以理解它: 数据库需要知道哪个会话已死亡。 死会话必须被释放,因为它只保存资源,如果这个操作没有完成,我们应该获得很多锁,否则我们可能会失去可用的连接(达到最大值) 其他数据库(FireBird、EDB)为其定义超时参数 到达时,会话设置为死,用户连接中止 为了避免精疲力竭,你需要定期做一些事情,延长时间 有三种方法可以达到超时: 1.)客户端程序挂起、冻结或关闭。 2.)网络连接中断 3.)客户端发送了一些很长的查询/存储过程,但没有完成 如果服务器未处理超时,则可能有人的事务、锁等在X小时内仍处于活动状态,您只有一种方法可以删除它:重新启动db server服务 其他数据库处理死机会话,因为它们不再与服务器交互,因此客户端出现一些错误,需要重新启动客户端软件 一些数据库支持返回到“非活动”但“非死”会话,并且可以继续工作 因此,在这篇序言中,我再次提出我的问题:
dd我不理解你问题的第一部分,但是要终止正在运行的会话,你可以使用
pg\u terminate\u backend()
要终止正在运行的会话的查询,请使用pg\u cancel\u query()
手册中对这两种功能进行了说明:
有三种方法可以达到超时:1.)客户端程序挂起、冻结或关闭。2.)网络连接断开3.)客户端发送了一些很长的查询/存储过程,但没有完成
对于2,tcp_keepalives_*设置可能有用:
对于3,有一个语句超时设置:但这只会终止语句,而不会终止连接。我不知道Postgres中有这样的设置。对我来说,这听起来像是你最好修复应用程序中的连接处理。我能想到的唯一“解决方案”是使用位于应用程序和数据库之间的连接池(如pgpool或pgBouncer)。由于它充当代理,应用程序不会意识到这一点。