• 连接管理

  • 终止正在执行的语句并杀掉连接

1) 查出活动连接列表,及其进程ID

select * from pg_stat_activity;

pg_stat_activity  视图包含每个连接上最近一次执行的语句、使用的用户名(usename字段)、所在的database名(datname字段)、以及语句开始执行的时间
,通过查询该视图可以找到需要终止会话所对应的进程ID 

2) 取消连接 ,假设对应的ID 号码是345  的活动查询。
select pg_cancel_backend(345);
该操作不会终止连接本身。

3)终止该连接

select pg_terminate_backend(345);

注意仅仅终止正在执行的语句而没彻底杀掉连接,客户端可以立即重新执行刚刚被终止掉的会话语句的,这会导致系统陷入之前的状态。


注意上边语句只能一次性处理一个连接。


终止某个用户的所有连接

select pg_terminate_backend(pid)  from pg_stat_activity
where username ='用户'


--杀死进程 ,pid为进程id

*设置的几个参数


deadlock_timeout:该参数表示在进行死锁检测之前需要等待多久,默认1000ms。如果有大量操作,建议增大该值以减少死锁检测的次数。
update 语句建议加nowait子句避免死锁。select for update nowait 。该语句会在死锁时自动终止执行。
select for update skip locked,该语法可以逃过已经被别的用户锁定的记录。


statement_timeout:该参数可以控制一个语句能够执行的最长时间。超出限定时间后该语句会被自动终止。默认为0,无限制。
如果你的函数要耗时很久,建议不要设置全局级别,仅在要控制的函数的定义中针对函数自身设置。


lock_timeout:该参数控制锁等待的最长时间,超出限定时间后等待锁的语句就会自动终止。
对于执行数据更新的语句来说,该参数有较大价值,因为每次更新数据之前必须先获取待修改的记录的排他锁,所以更新语句之间最容易发生锁等待。默认值0,不限制锁等待时间。
一般在函数级别,或者会话界别设置。

该值应该设置statement_timeout小,否则语句总是先超时。


idle_in_transcation_session_timeout

该参数表示一个事务可以处于idle状态的最长时间,超过限定时间后,该事务会自动回滚。 默认值为0,表示事务可以永久处于idle状态。