我有以下脚本来检索postgresql数据库的连接数:
import psycopg2, time
db_ip = "192.168.1.137"
db_port = "5432"
db_name = "postgres"
db_username = "postgres"
db_pw = "pass"
db = psycopg2.connect("host=%s port=%s dbname=%s user=%s password=%s" % (db_ip, db_port, db_name, db_username, db_pw))
cur = db.cursor()
while True:
#~ db = psycopg2.connect("host=%s port=%s dbname=%s user=%s password=%s" % (db_ip, db_port, db_name, db_username, db_pw))
#~ cur = db.cursor()
cur.execute("SELECT count(*) FROM pg_stat_activity;")
current_connections = cur.fetchall()
print current_connections
#~ cur.close()
#~ db.close()
time.sleep(1)
cur.close()
db.close()
实际连接的数量是波动的,但脚本只会重复返回初始值,除非我取消注释在while循环的每次迭代中重新建立连接的行。
这是设计,还是我错过了什么?理想情况下,我更喜欢连接一次,然后只是运行查询。
提前感谢任何指导。
答案 0 :(得分:1)
是肯定的。这是设计和你缺少的东西。 postgres试图呈现查询按顺序处理的错觉;好像他们一次只发生一个。这样,并发应用程序需要担心看到来自其他进程的部分更新数据。在将资金用于收款人之前,您不希望看到资金余额。这称为事务隔离。
您缺少的部分是您需要告诉postgres您已经完成了一项交易,并希望开始一项新交易。您可以通过在光标上发出commit
,或关闭光标并从现有连接中获取新光标来实现此目的