Django не может закрыть постоянное соединение Mysql
Проблема:
Наше приложение Django включает в себя архивирование больших папок, которое занимает слишком много времени (до 48 часов), поэтому соединение Django с базой данных разрывается по таймеру и выдает: "MySQL server has gone away error".
Описание:
У нас есть приложение Django версии==3.2.1, значение CONN_MAX_AGE установлено в 1500(секунд). По умолчанию wait_timeout в Mysql(MariaDB) составляет 8 часов.
ТаблицаExportStatus имеет следующие атрибуты:
- package_size
- zip_time
Наше приложение работает следующим образом:
Запилите папки
установите атрибут 'package_size' таблицы ExportStatus после архивации и сохраните в базе данных.
установить атрибут 'zip_time' таблицы ExportStatus после zipping и сохранить в базе данных.
Обратите внимание на установку значений столбцов в базе данных. Для этого требуется соединение django с базой данных, которое отключается по таймеру после длительного процесса зацикливания. Таким образом, возникает ошибка MySQL server gone away.
Что мы пробовали до сих пор:
-
from django.db import close_old_connections` close_old_connections()
Это решение не работает.
Сразу после застегивания, если время, затраченное на это, превышает 25 минут, мы закрываем все соединения и обеспечиваем новое соединение следующим образом:
from django.db import connections for connection in connections.all(): try: # hack to check if the connection still persists with the database. with connection.cursor() as c: c.execute("DESCRIBE auth_group;") c.fetchall() except: connection.close() connection.ensure_connection()
После печати значения длины connections.all() оно равно 2. Мы не понимаем, как Django сохраняет эти старые соединения и извлекает соединения из пула соединений. Когда мы закрываем соединения из connections.all(), разве мы не закрываем все соединения в пуле потоков?
Сначала мы устанавливаем package_size, а затем устанавливаем zip_time. Проблема с этим решением заключается в том, что иногда (не всегда) возникает одна и та же ошибка при установке атрибута zip_time. Иногда это решение действительно работает. Нет проблем с установкой package_size, но при установке атрибута 'zip_time' периодически возникает ошибка. Итак, наш вопрос заключается в том, что если мы уже сбросили соединения после запечатывания, почему это все еще берет несвежее соединение из пула соединений и выбрасывает ошибку MySQL server gone away? Есть ли у нас способ закрыть все старые постоянные соединения и создать новые?