Почему я получаю исключение «Сервер MySQL исчез» в Django?Python

Программы на Python
Ответить
Anonymous
 Почему я получаю исключение «Сервер MySQL исчез» в Django?

Сообщение Anonymous »

Я работаю с Django 2.2.6.

В той же системе, в которой работает мой проект django, также работает фоновая служба, прослушивающая сокет unix на предмет запросов. . В Django Admin, если пользователь нажимает кнопку, Django отправляет запрос на сокет unix, и фоновая служба что-то делает.

Моя фоновая служба имеет полный доступ к Django. ОРМ. Он импортирует модели из файла models.py моего проекта и может без проблем запрашивать базу данных.

Проблема в том, что если я оставлю свой django, а моя фоновая служба будет работать на ночь , войдите в систему администратора Django и нажмите кнопку, моя фоновая служба выдаст исключение:

Код: Выделить всё

django.db.utils.OperationalError: (2006, 'MySQL server has gone away')
Похоже, это связано с тем, что в базе данных MySQL есть период ожидания, называемый wait_timeout. Если соединение с базой данных неактивно в течение долгого времени, MySQL отключит его. К сожалению, Django этого не замечает и пытается использовать, выдавая ошибку.

К счастью, в Django есть своя встроенная переменная CONN_MAX_AGE для каждой базы данных, определенной в настройках. .py. Если соединение с базой данных старше CONN_MAX_AGE, оно закрывается перед запросом и запускается новое.

Просмотр моей базы данных MySQL:

Код: Выделить всё

> show session variables where variable_name = "wait_timeout";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+
Просмотр переменной CONN_MAX_AGE моего Django:

Код: Выделить всё

# ./manage.py shell
>>> from django.conf import settings
>>> settings.DATABASES['default']['CONN_MAX_AGE']
0
Примечание: база данных «по умолчанию» — единственная, которую я определил в своих настройках.

Также обратите внимание, что и мой MySQL wait_timeout, и мой CONN_MAX_AGE моего Django являются значениями по умолчанию - я не менял их.

Согласно документации Django здесь, значение CONN_MAX_AGE, равное 0, означает :


закрывать соединения с базой данных в конце каждого запроса


Если django предназначен для закрытия соединения с базой данных после каждого запроса, почему я сталкиваюсь с этой ошибкой? Почему он не закрывает старые соединения, как только я завершаю выполнение запроса, и не запускаю новое соединение, когда я делаю новый запрос, несколько часов спустя?

Изменить:

На данный момент мое решение состоит в том, чтобы моя фоновая служба работала в режиме пульса. Кажется, раз в час работает нормально. Heartbeat — это простая команда MySQL с низким потреблением ресурсов, такая как MyDjangoModel.objects.exists(). Пока он выполняет запрос MySQL для обновления тайм-аута MySQL, он работает. Это усложняет мою фоновую службу, так как в одном случае моей однопоточной фоновой службе потребовался фоновый поток, единственной задачей которого было выполнение контрольных сигналов.

Если есть более простое решение или хотя бы объяснение, почему это происходит, я хотел бы его услышать.

Подробнее здесь: https://stackoverflow.com/questions/597 ... -in-django
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»