在数据库postgresql中,一个客户端到服务器连接实际上是一个tcp socket连接,tcp连接是虚连接,一方非正常退出(如断电),另一方会继续维持这个连接。
 
举个例子,一个客户端电脑正常连上服务器后,强行拔掉电源造成人为断电,重新启动电脑,再此连上服务器。用SQL语句select * from pg_stat_activily 查看服务器的所有连接,会发现本客户端的连接除了本次外,断电前的连接还在。因为服务器根本不知道客户端的断电行为,还以为那连接正在空闲状态。
 
然而这个死连接不会永远存在,2个小时后,服务器上的这个连接会自动切掉,因为postgresql支持TCP_KEEPLIVE机制。有三个 系统变量tcp_keepalives_idle,tcp_keepalives_interval ,tcp_keepalives_count 来设 置postgresql如何处理死连接。
 
对于每个连接,postgresql会对这个连接空闲tcp_keepalives_idle秒后,主动发送tcp_keeplive包给客户 端,以侦探客户端是否还活着 ,当发送tcp_keepalives_count个侦探包,每个侦探包在tcp_keepalives_interval 秒内没有回应,postgresql就认为这个连接是死的。于是切断这个死连接。
 
在postgresql, 这三个参数都设为0将使用操作系统的默认值,在linux下,tcp_keepalives_idle一般是2个小时,也就是2个小时后,服务器才可以自动关掉死连接。在实际应运中,可以自行调整以上参数。
 
然而,单单依靠服务器以此方法来切掉死连接,是永远不够。假设有一个连接,在运行以下交互式命令中突然断电
begin transaction;
lock table xxx in exclusive mode;
-- 突然断电,这种可能很小,但肯定存在
。。。
commit
 
由于这个连接还保留着,且这个transaction还没结束(本来上1秒之内的事务,现在变成至少要2个小时),所以这个表的锁一直存在着,导致系统的并发性严重降低。
 
所以必需有手工杀掉连接的语句来切掉此连接,以释放锁。不幸的是,直到8.3,postgresql还没有此语句,源代码是有pg_terminate_query函数,因为有bug, 被屏蔽掉,必须到8.4才有。
 
所以只能用操作系统的命令杀掉此连接,或者重启服务器。 在linux下,杀掉此连接的命令是:
kill -s SIGTERM 进程号。
 
这个内容有点老,但是思想是一一致的,详细可参见:http://blog.163.com/digoal@126/blog/static/163877040201331041830502/

postgresql是如何处理死连接(转)的更多相关文章

  1. 浅析Postgres中的并发控制(Concurrency Control)与事务特性(下)

    上文我们讨论了PostgreSQL的MVCC相关的基础知识以及实现机制.关于PostgreSQL中的MVCC,我们只讲了元组可见性的问题,还剩下两个问题没讲.一个是"Lost Update& ...

  2. PostgreSQL的PITR中,对 unfilled wal log 如何处理为好

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL基础知识与基本操作索引页     回到顶级页面:PostgreSQL索引页 通过实验,可以发现,PostgreSQL中使 ...

  3. PostgreSQL Replication之第十五章 与Walbouncer 一起工作

    与Walbouncer 一起工作 在本书的最后一章,将引导您通向2014年发布的一个工具,称为walbouncer.本书中的大多数技巧说明了如何复制整个数据库实例,如何分片,等等.在最后一章,是关于w ...

  4. PostgreSQL Replication之第十三章 使用PL/Proxy扩展(3)

    13.3 聪明地扩展与处理集群 建立集群不是您面临的唯一任务.如果所有的事情都做完了并且系统已经运行了,您可能需要到处调整配置. 13.3.1 添加和移动分区 一旦一个集群启动并运行,您可能会发现您的 ...

  5. PostgreSQL Replication之第十二章 与Postgres-XC一起工作(7)

    12.7 处理故障转移和删除节点 在本节中,我们将看看故障切换如何处理.我们还将看看如何使用安全可靠的方法添加节点到Postgres-XC设置以及如何从Postgres-XC设置删除节点. 12.7. ...

  6. postgresql pg_hba.conf

    pg_hba.conf是客户端认证配置文件 METHOD指定如何处理客户端的认证.常用的有ident,md5,password,trust,reject. PostgreSQL默认只监听本地端口,用n ...

  7. Mybatis调用PostgreSQL存储过程实现数组入参传递

    注:本文来源于 < Mybatis调用PostgreSQL存储过程实现数组入参传递  > 前言 项目中用到了Mybatis调用PostgreSQL存储过程(自定义函数)相关操作,由于Pos ...

  8. postgresql总结

    这篇博客主要对PostgreSQL进行总结,内容偏基础. 这里先附上一个PostgreSQL的中文资源:PostgreSQL 8.1 中文文档.英文不好的同学可以看看这个. 安装PostgreSQL ...

  9. PostgreSQL基础知识与基本操作索引页

    磨砺技术珠矶,践行数据之道,追求卓越价值 返回顶级页:PostgreSQL索引页 luckyjackgao@gmail.com 本页记录所有本人所写的PostgreSQL的基础知识和基本操作相关文摘和 ...

随机推荐

  1. [django]从前端返回字符串,后端转换为字典,执行数据添加操作

    具体如题: js代码如下: $('#bill_add').click(function(){//合同添加 var bill1 = $("#bill1").val();var bil ...

  2. Oozie coordinator 作业自定义的配置的一些方法

    Oozie的coordinator有啥用? The Oozie Coordinator system allows the user to define and execute recurrent a ...

  3. POJ2104 K-th Number[主席树]【学习笔记】

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 51440   Accepted: 17594 Ca ...

  4. NSBundle

    属性: .使用类方法创建一个NSBundler对象 + (NSBundle *)mainBundle; eg:[NSBundle mailBundle]; .使用路径获取一个NSBundle 对象,这 ...

  5. java多线程系类:JUC线程池:02之线程池原理(一)

    在上一章"Java多线程系列--"JUC线程池"01之 线程池架构"中,我们了解了线程池的架构.线程池的实现类是ThreadPoolExecutor类.本章,我 ...

  6. makefile--subst

    Makefile里的subst用法是$(subst FROM,TO,TEXT),即将TEXT中的东西从FROM变为TOMakefile中的字符串处理函数格式:    $(subst ;,;,;)名称: ...

  7. HTML标记语言篇--学习笔记01

    HTML标记语言篇 第1章  HTML基础 1.1 基本概念 WWW 是"World Wide Web"(全球广域网)的缩写,简称为Web,中文又称为"万维网" ...

  8. 通过sqlserver发送邮件

    配置过程请参考:http://www.2cto.com/database/201403/289114.html 实际中应用的扩展: 1.编写一个触发器(相当于一个多线程的发邮件的服务). 2.在应用程 ...

  9. Ubuntu 14.04 掛載 網路磁碟 mount internet disk

    1.install cifs tool (Common Internet File System) 新增 /etc/apt/apt.conf.d/01proxy 檔案並加入以下字串,即可透過此台機器做 ...

  10. django request对象和HttpResponse对象

    HttpRequest对象(除非特殊说明,所有属性都是只读,session属性是个例外)HttpRequest.scheme 请求方案(通常为http或https)HttpRequest.body 字 ...