2014-02-16 4 views
0

Я создал свой собственный модуль для управления объектами в базе данных. Чтобы ограничить соединения с базой данных, я создаю выделенный класс одним способом.Управление соединением базы данных с синглонами Python

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.') 

Первоначальный экземпляр, напечатанный «Соединение с базой данных открылось». как и ожидалось. Второй экземпляр напечатал ничего, как ожидалось. Первый экземпляр удалил как можно скорее. Второй экземпляр удалил ничего, но ожидалось, что сообщение «Соединение с базой данных закрыто».

Я легко понимаю причину: ссылка все еще существует, но я не знаю почему. Как удалить все ссылки, чтобы закрыть соединение с базой данных?

С уважением, Serge

ответ

0

DBConnection.instance содержит ссылку на ваш одноплодной инстанции. Новый вызов DBConnection() по-прежнему будет возвращать существующее значение DBConnection.instance. Вам нужно будет сохранить weakref для вашего экземпляра singleton в DBConnection.instance, если вы не хотите, чтобы он подсчитывал счетчик ссылок вашего экземпляра.

+0

Спасибо @lanzz за ваш ответ. По вашему мнению, как я могу хранить weakref для моего экземпляра класса? Единственный способ, который я вижу, - создать первый экземпляр, а затем создать weakref для первого, но я все еще не могу закрыть соединение с базой данных ... – srjjio

+0

Я мог бы помочь вам, если вы разместите свои попытки использовать 'weakref'. В документах модулей представлено множество примеров использования 'weakref'. Я не могу догадаться, почему ваш экземпляр еще не выпущен без просмотра вашего измененного кода. – lanzz

Смежные вопросы