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 имеет следующие атрибуты:

  1. package_size
  2. zip_time

Наше приложение работает следующим образом:

  1. Запилите папки

  2. установите атрибут 'package_size' таблицы ExportStatus после архивации и сохраните в базе данных.

  3. установить атрибут 'zip_time' таблицы ExportStatus после zipping и сохранить в базе данных.

Обратите внимание на установку значений столбцов в базе данных. Для этого требуется соединение django с базой данных, которое отключается по таймеру после длительного процесса зацикливания. Таким образом, возникает ошибка MySQL server gone away.

Что мы пробовали до сих пор:

  1. from django.db import close_old_connections`
    close_old_connections()
    

    Это решение не работает.

  2. Сразу после застегивания, если время, затраченное на это, превышает 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? Есть ли у нас способ закрыть все старые постоянные соединения и создать новые?

Вернуться на верх