python 3 , в качестве драйвера к базе данных - mysqlclient
Необходимо на одной из страниц подключатся к базе данных на другом сервере и вытаскивать из нее данные.
tasks.py , который осуществляет вызов
from project.redmine.agregator import Redmine @task(executor=TaskExecutor.SPOOLER, retry_count=1, retry_timeout=5) def redmine_data_update(): r = Redmine() r.import_tasks()
agregator.py , собственно как все происходит
import logging log = logging.getLogger('tasks') class Redmine: db = None def __init__(self): self.db = _mysql.connect(host=settings.REDMINE_DB_HOST, db=settings.REDMINE_DB_NAME, user=settings.REDMINE_DB_USER, passwd=settings.REDMINE_DB_PASS) self.db.query("SET NAMES utf8;") self.db.query("SET CHARACTER SET utf8;") self.db.query("SET character_set_connection=utf8;") log.info('MySQL connection to redmine opened.') def __del__(self): self.db.close() log.info('MySQL connection to redmine closed.') def import_tasks(self): query = "SELECT ... сам запрос" try: self.db.query(query) res = self.db.use_result() rs = list(RedmineTasks.objects.filter().values_list('task_id', flat=True)) except Exception as e: log.error('MySQL error: %s' % e) return row = res.fetch_row()
Проблема в том, что через пару часов перестает работать по причине “MySQL server has gone away”.
Т.е. изначально в логе вижу корректное
(tasks:24) MySQL connection to redmine opened. (tasks:28) MySQL connection to redmine closed.
(tasks:24) MySQL connection to redmine opened. (tasks:48) MySQL error: (2006, 'MySQL server has gone away')
Собственно несколько вопросов:
1. почему при екзепшене и выходе из функции не срабатывает __del__ метод
2. как красиво решить задачу без принудительного вызова метода закрытия коннекшена