В той же системе, в которой работает мой проект django, также работает фоновая служба, прослушивающая сокет unix на предмет запросов. . В Django Admin, если пользователь нажимает кнопку, Django отправляет запрос на сокет unix, и фоновая служба что-то делает.
Моя фоновая служба имеет полный доступ к Django. ОРМ. Он импортирует модели из файла models.py моего проекта и может без проблем запрашивать базу данных.
Проблема в том, что если я оставлю свой django, а моя фоновая служба будет работать на ночь , войдите в систему администратора Django и нажмите кнопку, моя фоновая служба выдаст исключение:
Код: Выделить всё
django.db.utils.OperationalError: (2006, 'MySQL server has gone away')
К счастью, в Django есть своя встроенная переменная CONN_MAX_AGE для каждой базы данных, определенной в настройках. .py. Если соединение с базой данных старше CONN_MAX_AGE, оно закрывается перед запросом и запускается новое.
Просмотр моей базы данных MySQL:
Код: Выделить всё
> show session variables where variable_name = "wait_timeout";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 28800 |
+---------------+-------+
Код: Выделить всё
# ./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
Мобильная версия