使用Python单例管理数据库连接

时间:2014-02-16 16:53:07

标签: python singleton database-connection psycopg2

我创建了自己的模块来管理数据库中的对象。为了限制与数据库的连接,我以单件方式设计了一个专用类。

按预期调用construstor但从不调用析构函数,因此数据库连接永远不会关闭。

class DBConnection:
    instance = None
    con = None

    def __new__(cls):
    if DBConnection.instance is None:
        DBConnection.instance = object.__new__(cls)
    return DBConnection.instance

    def __init__(self):
    if DBConnection.con is None:
        try:
            DBConnection.con = psycopg2.connect(database='...', user='...', password='...')
            print('Database connection opened.')
        except psycopg2.DatabaseError as db_error:
            print("Erreur :\n{0}".format(db_error))

    def __del__(self):
    if DBConnection.con is not None:
        DBConnection.close()
        print('Database connection closed.')

第一个实例打印出“数据库连接已打开”。正如所料。第二个实例没有按预期打印。删除的第一个实例没有按预期打印。删除的第二个实例没有打印,但我期望消息“数据库连接关闭”。

我很容易理解原因:参考仍然存在,但我不知道为什么。如何删除所有引用以关闭数据库连接?

此致 哔叽

1 个答案:

答案 0 :(得分:0)

DBConnection.instance包含对您的单例实例的引用。对DBConnection()的新调用仍会返回DBConnection.instance的现有值。如果您不希望它计入实例的引用计数,则需要在DBConnection.instance中为单例实例存储weakref