在数据库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 进程号。
分享到:
相关推荐
本教程将详细介绍如何在Java项目中使用Druid数据连接池连接PostgreSQL数据库,以实现一个简单的测试环境。 首先,我们需要了解Druid数据连接池的基本概念。Druid提供了一种高效、灵活的数据库连接管理方式,它可以...
在Java编程中,连接到PostgreSQL数据库通常需要特定的驱动程序,这个驱动程序通常是以JAR(Java Archive)文件的形式存在。"连接postgresql数据库需要的jar包"指的是用于建立Java应用程序与PostgreSQL数据库之间通信...
在IT行业中,Presto是一个分布式SQL查询引擎,设计用于快速处理大规模的数据。它支持多种数据源,包括Hadoop Distributed File System (HDFS)、Amazon S3、Cassandra以及我们这里关注的PostgreSQL。本篇文章将详细...
Python 操作 PostgreSQL 数据库是一种常见的任务,特别是在数据处理和Web应用开发中。PostgreSQL 是一个功能强大的开源关系型数据库系统,而Python作为一种流行的编程语言,提供了多种方式来与之交互。在Python中,...
"封装连接PostgreSQL类"这个主题涉及到的是使用编程语言(可能是C或C++)创建一个类,该类简化了与PostgreSQL数据库的交互过程。下面将详细阐述这一知识点。 首先,`connectPQ.c`和`connectPQ.h`文件很可能分别代表...
**PostgreSQL JDBCL连接详解** 在Java编程中,与关系型数据库进行交互的一个常见方式是使用Java Database Connectivity (JDBC) API。JDBC提供了一组标准接口和类,使得Java程序可以与各种不同的数据库系统进行通信...
将PostgreSQL与VS连接,可以方便地进行数据存储、查询和处理。本文将详细讲解在Windows环境下,使用VS连接PostgreSQL所需的一些关键库文件及其作用。 1. **libpq.dll**:这是PostgreSQL的C语言接口库,提供了一系列...
ArcGIS通过SDE接口与PostgreSQL数据库建立连接,以便存储、查询和处理地理空间信息。 当尝试在ArcGIS中连接到PostgreSQL SDE时,可能遇到以下问题: 1. **驱动兼容性**:ArcGIS可能缺少与PostgreSQL版本兼容的驱动...
在与数据库交互时,ArcGIS需要特定的客户端库来支持连接不同的数据库系统,比如PostgreSQL。PostgreSQL是一种强大的开源关系型数据库系统,常被用于存储和管理大量的地理空间数据。以下将详细介绍标题和描述中提到的...
### Navicat 连接 PostgreSQL 报错:ERROR: SSL connection is required by the database system 在使用 Navicat 连接 PostgreSQL 数据库时遇到“ERROR: SSL connection is required by the database system”错误...
PostgreSQL是一种开源的对象关系型数据库管理系统,广泛应用于企业级数据存储和处理。本资源提供了使用JDBC连接到PostgreSQL数据库的源码和所需jar包,这对于初学者或开发者来说是一个非常实用的起点。 首先,我们...
### 浅析PostgreSQL事务处理机制 #### PostgreSQL简介 PostgreSQL是一款开源的对象关系数据库系统,其历史可以追溯至1977年,由Michael Stonebraker领导的加州伯克利分校的INGRES项目发端。它支持大部分SQL标准,...
在本文中,我们将深入探讨如何使用MyBatis框架通过JDBC连接PostgreSQL数据库,构建一个最小的示例项目。MyBatis是一个轻量级的Java持久层框架,它简化了数据库操作,允许开发者将SQL语句直接嵌入到Java代码中,提供...
总结来说,这个教程涵盖了从安装PostgreSQL 9.2和PostGIS 2.18,到连接ArcMap 10.2并导入地理数据的全过程。通过这些步骤,你可以构建一个功能强大的GIS环境,用于存储、管理和分析地理空间数据。在实际操作中,请...
本示例将详细介绍如何使用JDBC连接到PostgreSQL数据库并执行简单的数据获取操作。PostgreSQL是一种开源的对象关系型数据库管理系统,因其强大的功能和稳定性而广受欢迎。 首先,确保已安装PostgreSQL数据库并在系统...
在本示例中,我们将详细讲解如何使用JDBC连接到PostgreSQL数据库,这是一个非常基础且实用的技能,对于任何需要在Java应用程序中处理数据库的开发者来说都是必不可少的。 首先,你需要确保已经在你的系统上安装了...
`postgresql-42.3.3.jar` 提供了对PostgreSQL的JDBC驱动实现,使得Java开发者可以利用JDBC API来执行诸如建立数据库连接、执行SQL查询、处理结果集等任务。 在使用`postgresql-42.3.3.jar`之前,你需要将其添加到你...
在IT行业中,数据库连接是开发过程中的重要环节,特别是在使用代码生成工具如CodeSmith时。本文将详述CodeSmith 8.0.1版本在尝试连接到PostgreSQL数据库时遇到的问题,以及如何通过添加必要的DLL文件和理解连接字符...
通过学习这个示例源码,初学者能够掌握如何在C# WinForm应用中连接到PostgreSQL数据库,执行基本的SQL操作,以及处理返回的结果。这个过程中涉及的关键概念包括数据库连接、命令执行、结果集处理和事务管理。对于想...
在SSM框架中,我们需要配置数据库连接池(如Druid或HikariCP),编写SQL映射文件,并创建对应的Mapper接口,以便通过MyBatis与PostgreSQL进行数据交互。 5. **整合过程**:整合SSM和PostgreSQL通常包括以下步骤: ...