bugfix> python > 投稿

Pythonで書かれた無限のスクリプトがあり、Postgresqlに接続し、コンピューターに接続されたカメラの前に人が現れたときにレコードを挿入します。

人が現れるたびに接続して閉じる必要がある場合、または何らかの方法で接続を保存できる場合は、データベースに接続する(および接続を保存する)最善の方法を知りたいです。無限ループの前に接続を作成し、カメラの前にアクティビティがない場合、接続はアイドル状態のままになり、スクリプトがしばらくして新しい行を挿入しようとすると、接続が閉じられるためです。新しい行を挿入するたびに接続すると、問題はありませんが、これは遅くなります。

ご提案ありがとうございます。

回答 1 件
  • 接続プールは、この種のものに適しています。私は本番環境では使用していません(主にDjangoまたはSQLAlchemyを使用)が、 psycopg2.pool  いくつかの異なる実装( SimpleConnectionPool  または PersistentConnectionPool )それはおそらくあなたのニーズに合うでしょう。一般的に、プールは共有リソースとして接続を管理するだけでなく、必要に応じて接続をテストおよび再初期化するのにも役立ちます。

    from psycopg2 import pool
    conn_pool = pool.PersistentConnectionPool(minconn, maxconn, **dbopts)
    def work_method():
        conn = conn_pool.getconn()
        with conn.cursor() as stmt:
            stmt.execute(sql)
        conn_pool.putconn(conn)
    
    

    ザ・ putconn  これは非常に重要です。そのため、例外は、接続がまだ使用中であるとプールに残さないようにします。コンテキストマネージャとして処理するとよいでしょう。

    import contextlib
    @contextlib.contextmanager
    def get_db_connection():
        conn = conn_pool.getconn()
        yield conn
        conn_pool.putconn(conn)
    def work_method():
        with get_db_connection() as conn:
            with conn.cursor() as stmt:
                stmt.execute(sql)
    
    

    お役に立てば幸いです。

あなたの答え