postgresql 一个到应用程序数据库的连接,还是每次执行时都连接?

kse8i1jr  于 2022-11-23  发布在  PostgreSQL
关注(0)|答案(2)|浏览(152)

我正在使用psycopg2库连接到我的postgresql数据库。每次我想执行任何查询时,我都会创建一个新的连接,如下所示:

import psycopg2

def run_query(query):
    with psycopg2.connect("dbname=test user=postgres") as connection:
        cursor = connection.cursor()
        cursor.execute(query)
        cursor.close()

但我认为为整个应用程序执行创建一个连接会更快,如下所示:

import psycopg2

connection = psycopg2.connect("dbname=test user=postgres")

def run_query(query):
    cursor = connection.cursor()
    cursor.execute(query)
    cursor.close()

那么,在应用程序的所有执行时间内,哪种方法更好地连接数据库呢?
两种方法我都试过了,都奏效了,但我想知道哪一种更好,为什么。

vm0i2vca

vm0i2vca1#

您应该强烈考虑使用连接池,正如其他答案所建议的那样,这将比每次查询时创建一个连接的成本更低,并且可以处理单靠一个连接无法处理的工作负载。
创建一个名为www.example.com的文件mydb.py,并包含以下内容:

import psycopg2
import psycopg2.pool
from contextlib import contextmanager

dbpool = psycopg2.pool.ThreadedConnectionPool(host=<<YourHost>>,
                                      port=<<YourPort>>,
                                      dbname=<<YourDB>>,
                                      user=<<YourUser>>,
                                      password=<<YourPassword>>,
                                      )

@contextmanager
def db_cursor():
    conn = dbpool.getconn()
    try:
        with conn.cursor() as cur:
            yield cur
            conn.commit()
    """
    You can have multiple exception types here.
    For example, if you wanted to specifically check for the
    23503 "FOREIGN KEY VIOLATION" error type, you could do:
    except psycopg2.Error as e:
        conn.rollback()
        if e.pgcode = '23503':
            raise KeyError(e.diag.message_primary)
        else
            raise Exception(e.pgcode)
     """
    except:
        conn.rollback()
        raise
    finally:
        dbpool.putconn(conn)

这将允许您按如下方式运行查询:

import mydb

def myfunction():
    with mydb.db_cursor() as cur:
        cur.execute("""Select * from blahblahblah...""")
j5fpnvbx

j5fpnvbx2#

这两种方法都不好。第一种方法尤其不好,因为打开数据库连接的开销很大。第二种方法也不好,因为最后只会得到一个连接(太少了),每个进程或线程一个连接(通常太多了)。
使用连接池。

相关问题