gpt4 book ai didi

python - 整个 python 应用程序中的单个数据库连接(遵循单例模式)

转载 作者:行者123 更新时间:2023-12-04 02:09:01 25 4
gpt4 key购买 nike

我的问题是在整个应用程序中维护单个数据库连接的最佳方法是什么? 使用单例模式?如何?

需要注意的条件:

  • 如果有多个请求,我应该使用相同的连接
  • 如果连接关闭,则创建一个新连接
  • 如果连接超时,在新请求时,我的代码应该创建一个新连接。


  • Django ORM 不支持我的数据库的驱动程序。由于相同的驱动程序相关问题,我正在使用 pyodbc连接到数据库。现在我有以下用于创建和管理数据库连接的类(class):
    class DBConnection(object):
    def __init__(self, driver, serve,
    database, user, password):

    self.driver = driver
    self.server = server
    self.database = database
    self.user = user
    self.password = password

    def __enter__(self):
    self.dbconn = pyodbc.connect("DRIVER={};".format(self.driver) +\
    "SERVER={};".format(self.server) +\
    "DATABASE={};".format(self.database) +\
    "UID={};".format(self.user) +\
    "PWD={};".format(self.password) + \
    "CHARSET=UTF8",
    # "",
    ansi=True)

    return self.dbconn

    def __exit__(self, exc_type, exc_val, exc_tb):
    self.dbconn.close()

    但是这种方法的问题在于它会为每个查询创建新的数据库连接。遵循 的更好方法是什么?单例模式 ?如果连接关闭,我能想到的方式将保留对连接的引用。就像是:
     def get_database_connection():
    conn = DBConnection.connection
    if not conn:
    conn = DBConnection.connection = DBConnection.create_connection()
    return conn

    实现这一目标的最佳方法是什么?任何建议/想法/例子?

    PS:我正在检查是否使用 weakref 它允许创建对对象的弱引用。我认为使用 weakref 会是个好主意以及用于存储连接变量的单例模式。这样我就不必保持连接 alive当不使用 DB 时。大家对此有什么看法?

    最佳答案

    现在,我继续使用单例类方法。任何看到这其中潜在缺陷的人,都可以提及它们:)

    DBConnector类(class)用于创建连接

    class DBConnector(object):

    def __init__(self, driver, server, database, user, password):

    self.driver = driver
    self.server = server
    self.database = database
    self.user = user
    self.password = password
    self.dbconn = None

    # creats new connection
    def create_connection(self):
    return pyodbc.connect("DRIVER={};".format(self.driver) + \
    "SERVER={};".format(self.server) + \
    "DATABASE={};".format(self.database) + \
    "UID={};".format(self.user) + \
    "PWD={};".format(self.password) + \
    "CHARSET=UTF8",
    ansi=True)

    # For explicitly opening database connection
    def __enter__(self):
    self.dbconn = self.create_connection()
    return self.dbconn

    def __exit__(self, exc_type, exc_val, exc_tb):
    self.dbconn.close()

    DBConnection类(class)用于管理连接
    class DBConnection(object):
    connection = None

    @classmethod
    def get_connection(cls, new=False):
    """Creates return new Singleton database connection"""
    if new or not cls.connection:
    cls.connection = DBConnector().create_connection()
    return cls.connection

    @classmethod
    def execute_query(cls, query):
    """execute query on singleton db connection"""
    connection = cls.get_connection()
    try:
    cursor = connection.cursor()
    except pyodbc.ProgrammingError:
    connection = cls.get_connection(new=True) # Create new connection
    cursor = connection.cursor()
    cursor.execute(query)
    result = cursor.fetchall()
    cursor.close()
    return result

    关于python - 整个 python 应用程序中的单个数据库连接(遵循单例模式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40525545/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com