PostgreSQL连接不释放怎么办

PostgreSQL连接不释放怎么办

PostgreSQL连接不释放的解决方法如下:

推荐:postgresql教程

方法一:使用kill命令手动杀死进程

kill -s SIGTERM 进程号

方法二:创建脚本,自动杀死进程

使用python脚本监控postgres中超时的僵尸连接并将其释放,将代码保存为pgMonitor.py并添加到linux的corntab中定时执行即可

#coding:utf-8

from db.SqlUtil import *

import psycopg2.extras

from datetime import datetime,timedelta

import time

import os,sys

from subprocess import *

sql_conn=Driver().getConn()

cursor = sql_conn.cursor(cursor_factory=psycopg2.extras.DictCursor)

cursor.execute("select * from pg_stat_activity WHERE state='idle'  ORDER BY backend_start")

now=time.time()

for obj in cursor.fetchall():

    t=obj["query_start"]

    spT=now-time.mktime(t.timetuple())

    spTH=spT/3600

    if spTH>5:

        pid=obj["pid"]

        cmd="kill %s" % pid

        Popen(cmd, shell=True, stdout=PIPE)

    

cursor.close()

sql_conn.close()

在数据库postgresql中,一个客户端到服务器连接实际上是一个tcp socket连接,tcp连接是虚连接,一方非正常退出(如断电),另一方会继续维持这个连接,造成死连接。

由于这个连接保留着,且这个transaction还没结束(本来上1秒之内的事务,现在变成至少要2个小时(2个小时后,服务器才可以自动关掉死连接)),所以这个表的锁一直存在着,导致系统的并发性严重降低。

推荐学习《Python教程》。

以上是 PostgreSQL连接不释放怎么办 的全部内容, 来源链接: utcz.com/z/538976.html

回到顶部