У меня есть программа на Python, которая работает на фоне в течение нескольких недель и периодически выполняет запросы к базе данных. Для этого я использую ORM peewee
(версия 2.2.1). Я использую MySQL
в качестве бэкэнд.Повторное подключение MySQL к тайм-ауту
В последнее время я столкнулся с повторяющейся проблемой при доступе к БД, как правило, после нескольких дней работы программы. Ошибка, которая поднятый peewee
является
peewee.OperationalError: (2006, 'MySQL server has gone away')
отслеживающий глубоко в peewee
. Я отправляю его здесь, но, как мой virtualenv
делает имена файлов слишком долго, я их укорочения:
File ".../local/lib/python2.7/site-packages/peewee.py", line 2910, in save
ret_pk = self.insert(**field_dict).execute()
File ".../local/lib/python2.7/site-packages/peewee.py", line 2068, in execute
return self.database.last_insert_id(self._execute(), self.model_class)
File ".../local/lib/python2.7/site-packages/peewee.py", line 1698, in _execute
return self.database.execute_sql(sql, params, self.require_commit)
File ".../local/lib/python2.7/site-packages/peewee.py", line 2232, in execute_sql
self.commit()
File ".../local/lib/python2.7/site-packages/peewee.py", line 2104, in __exit__
reraise(new_type, new_type(*exc_value.args), traceback)
File ".../local/lib/python2.7/site-packages/peewee.py", line 2223, in execute_sql
res = cursor.execute(sql, params or())
File ".../local/lib/python2.7/site-packages/MySQLdb/cursors.py", line 205, in execute
self.errorhandler(self, exc, value)
File ".../local/lib/python2.7/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
peewee.OperationalError: (2006, 'MySQL server has gone away')
Возможные попытки файлик:
- В this question, один из комментариев рекомендуем pinging серверу
MySQL
время от времени, чтобы сохранить его (соединение?) вживую. Я не уверен, как это сделать через ORM. (должен я простоSELECT 1
каждый час, скажем?) - В this github peewee issue, который был открыт 4 месяца назад, указана одна и та же ошибка, хотя там утверждается, что он решен (и я использую более новую версию).
- В 7 year old issue из
trac
, одно из предложений заключается в увеличении таймаутаMySQL
на 3 дня. - В этом forum discussion предлагается вариант увеличения времени ожидания
MySQL
, но предлагается альтернатива «использования опции autoReconnect для соединителя JDBC MySQL». Я попытался выяснить, существует ли такая опция для модуляMySQLdb
Python, но не удалось найти. - Я нашел это MySQL reference page о поведении повторного подключения, но это немного сложно для моего понимания
MySQL
(обычно я работаю только с ОРМ), и я не знаю, как его применить отpeewee
.
Даже если я могу выполнить ping-базу данных, чтобы поддерживать связь в течение более длительного периода времени, я считаю, что считается плохой практикой поддерживать связь, когда она действительно не нужна. Есть ли способ возобновить соединение через ORM? Я рассматриваю как pinging, так и увеличение тайм-аута MySQL
в качестве обходных путей, в то время как реальным решением было бы повторно подключиться, когда это необходимо (и реальное решение - это то, о чем я прошу).
Проверьте значение 'wait_timeout' в MySQL –
Я предполагаю, что это 8 часов; разве это не по умолчанию? – Bach
Да, это по умолчанию. –