1

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 ループの反復ごとに接続を再確立する行のコメントを外さない限り、スクリプトは初期値を繰り返し返すだけです。

これは仕様によるものですか、それとも何か不足していますか? 理想的には、接続を一度確立してから、単純にクエリを実行することをお勧めします。

ご指導いただきありがとうございます。

4

1 に答える 1

1

はい。これは仕様によるものであり、何かが欠けています。postgres は、クエリが順番に処理されるように錯覚させようとします。まるで一度に 1 つずつ起こっているかのように。これは、完了した並行アプリケーションが、他のプロセスから部分的に更新されたデータを参照することを心配する必要があるためです。お金が引き出された後、受取人に適用される前に口座残高を見たくありません。これは、トランザクション分離と呼ばれます。

欠けている部分は、1 つのトランザクションが完了し、新しいトランザクションを開始したいということを postgres に伝える必要があるということです。これを行うには、カーソルで を発行するcommitか、カーソルを閉じて既存の接続から新しいカーソルをフェッチします。

于 2013-10-14T23:44:52.420 に答える