本文讨论PostgreSQL 数据库连接。首先回顾下数据库连接可能的状态,如何检查连接状况、终止空闲连接释放占用资源。
1. 概述
要修改或读取数据库,首先要创建数据库连接。但每个连接需要占用资源(包括进程和内存空间),系统资源是有限的仅能支撑一定数量的连接。一旦超过限制则会抛出异常或拒绝连接。PostgreSQL 在配置文件postgresql.conf可以通过参数进行有效限制。
下面我们看看PostgreSQL已建立连接的几种状态。如何发现连接正在运行或已经空闲了一段时间,对于空闲的连接应该终止并回收资源。
2. 连接状态
一旦创建了PostgreSQL连接,它能执行不同的操作并导致状态改变。基于状态和连接当前状态持续的时间决定连接状态是活动、空闲状态、遗弃。需要提醒的是,如果应用连接没有显示关闭连接,连接会保持有效,即使客户端已经断开连接的情况下也占用资源。
一般有四种连接状态:
活动:表示连接正在工作。
空闲:表示连接处于空闲状态,我们需要基于已空闲时间跟踪这些连接状态。
事务内空闲:这表示后端在事务中,但它目前没有做任何事情,可能正在等待最终用户的输入。
事务内空闲(终止):这种状态与事务内空闲类似,只是事务中某条语句导致错误。还需要根据闲置时间对其进行监控。
3. 管理连接状态
3.1 标识连接状态和持续时间
PostgreSQL提供pg_stat_activity 视图,可以获得连接的相关信息。如果执行下面语句可以返回相应信息:
SELECT pid, usename, backend_start,state,query, backend_type
from pg_stat_activity;
从上面输出可以看到state字段,可以根据该字段进一步过滤特定状态连接。如可以仅查询空闲的连接:
SELECT pid, usename, backend_start,state,query, backend_type
from pg_stat_activity
where state='idle';
3.2 查询不需要的连接
我们可以对查询进行更多的修改,以缩小寻找的信息范围,以便有针对性操作特定连接。我们可以查询仅为空闲的pid。我们还需要监控连接空闲后的时间,以检查是否有必要丢弃连接,释放资源。实例查询如下:
SELECT
pid,
usename,
application_name,
backend_start,
state_change,
STATE
FROM
pg_stat_activity
WHERE
STATE = 'idle';
3.3 必要时终止连接
一旦我们找到了处于挂起状态或长时间空闲的连接,我们可以使用下面这个查询来终止后端进程,而不影响服务器的操作:
SELECT pg_terminate_backend(PID);
4. 总结
本文介绍了PostgreSQL连接状态,如何查询不同状态的连接,终止挂起或空闲连接以释放资源。
本文参考链接:https://blog.csdn.net/neweastsun/article/details/111768850