我创建了自己的模块来管理数据库中的对象。为了限制与数据库的连接,我以单件方式设计了一个专用类。
按预期调用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.')
第一个实例打印出“数据库连接已打开”。正如所料。第二个实例没有按预期打印。删除的第一个实例没有按预期打印。删除的第二个实例没有打印,但我期望消息“数据库连接关闭”。
我很容易理解原因:参考仍然存在,但我不知道为什么。如何删除所有引用以关闭数据库连接?
此致 哔叽
答案 0 :(得分:0)
DBConnection.instance
包含对您的单例实例的引用。对DBConnection()
的新调用仍会返回DBConnection.instance
的现有值。如果您不希望它计入实例的引用计数,则需要在DBConnection.instance
中为单例实例存储weakref
。