apscheduler Потеряно соединение с сервером MySQL во время запроса

Я использую apscheduler для выполнения обычного задания, и у меня возникла ошибка.

«Потеряно соединение с сервером MySQL во время запроса»

Чтобы найти ответ, я пробую на нем несколько тестов и выясняю, что если моя база данных (MySQL) "wait_timeout" меньше времени интервала расписания, то возникает эта ошибка. (извините, здесь я сделал ошибку... меньше, чем...)

в тесте:

  • моя работа

    scheduler.add_job (период_задания, 'интервал', минуты = 5, id = 'my_job_id')

  • мои настройки базы данных

    время_ожидания = 60

  • мой тестовый код

    from apscheduler.schedulers.background import BackgroundScheduler
    from flask import Flask
    app = Flask(__name__)
    
    scheduler = BackgroundScheduler({'apscheduler.jobstores.default': {
            'type': 'sqlalchemy',
            'url': 'mysql+pymysql://user:pass@url:3306/test_apscheduler?charset=utf8'
        },
            'apscheduler.executors.default': {
                'class': 'apscheduler.executors.pool:ThreadPoolExecutor',
                'max_workers': '20'
        },
            'apscheduler.executors.processpool': {
            'type': 'processpool',
            'max_workers': '5'
        },
            'apscheduler.job_defaults.coalesce': 'false',
            'apscheduler.job_defaults.max_instances': '3',
            'apscheduler.timezone': 'UTC',
        })
    
    scheduler.start()
    
    
    @app.route('/')
    def hello_world():
        scheduler.add_job(period_job, 'interval', minutes=5, id='my_job_id')
        return 'Hello World!'
    
    
    def period_job():
        print("hihi")
    
    
    if __name__ == '__main__':
        app.run()
    

общее сообщение об ошибке:

Exception in thread APScheduler:
Traceback (most recent call last):
  File "C:\Users\skuo\apshcduler\lib\site-packages\sqlalchemy\engine\base.py", line 1139, in _execute_context context)
  File "C:\Users\skuo\apshcduler\lib\site-packages\sqlalchemy\engine\default.py", line 450, in do_execute cursor.execute(statement, parameters)
  File "C:\Users\skuo\apshcduler\lib\site-packages\pymysql\cursors.py", line 158, in execute result = self._query(query)
  File "C:\Users\skuo\apshcduler\lib\site-packages\pymysql\cursors.py", line 308, in _query conn.query(q)
  File "C:\Users\skuo\apshcduler\lib\site-packages\pymysql\connections.py", line 820, in query self._affected_rows = self._read_query_result(unbuffered=unbuffered)
  File "C:\Users\skuo\apshcduler\lib\site-packages\pymysql\connections.py", line 1002, in _read_query_result result.read()
  File "C:\Users\skuo\apshcduler\lib\site-packages\pymysql\connections.py", line 1285, in read first_packet = self.connection._read_packet()
  File "C:\Users\skuo\apshcduler\lib\site-packages\pymysql\connections.py", line 946, in _read_packet packet_header = self._read_bytes(4)
  File "C:\Users\skuo\apshcduler\lib\site-packages\pymysql\connections.py", line 982, in _read_bytes 2013, "Lost connection to MySQL server during query")
pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query')

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Python34\lib\threading.py", line 921, in _bootstrap_inner self.run()
  File "C:\Python34\lib\threading.py", line 869, in run self._target(*self._args, **self._kwargs)
  File "C:\Users\skuo\apshcduler\lib\site-packages\apscheduler\schedulers\blocking.py", line 27, in _main_loop wait_seconds = self._process_jobs()
  File "C:\Users\skuo\apshcduler\lib\site-packages\apscheduler\schedulers\base.py", line 801, in _process_jobs for job in jobstore.get_due_jobs(now):
  File "C:\Users\skuo\apshcduler\lib\site-packages\apscheduler\jobstores\sqlalchemy.py", line 69, in get_due_jobs return self._get_jobs(self.jobs_t.c.next_run_time <= timestamp)
  File "C:\Users\skuo\apshcduler\lib\site-packages\apscheduler\jobstores\sqlalchemy.py", line 131, in _get_jobs for row in self.engine.execute(selectable):
  File "C:\Users\skuo\apshcduler\lib\site-packages\sqlalchemy\engine\base.py", line 1991, in execute return connection.execute(statement, *multiparams, **params)
  File "C:\Users\skuo\apshcduler\lib\site-packages\sqlalchemy\engine\base.py", line 914, in execute return meth(self, multiparams, params)
  File "C:\Users\skuo\apshcduler\lib\site-packages\sqlalchemy\sql\elements.py", line 323, in _execute_on_connection return connection._execute_clauseelement(self, multiparams, params)
  File "C:\Users\skuo\apshcduler\lib\site-packages\sqlalchemy\engine\base.py", line 1010, in _execute_clauseelement compiled_sql, distilled_params
  File "C:\Users\skuo\apshcduler\lib\site-packages\sqlalchemy\engine\base.py", line 1146, in _execute_context context)
  File "C:\Users\skuo\apshcduler\lib\site-packages\sqlalchemy\engine\base.py", line 1341, in _handle_dbapi_exception exc_info
  File "C:\Users\skuo\apshcduler\lib\site-packages\sqlalchemy\util\compat.py", line 200, in raise_from_cause reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "C:\Users\skuo\apshcduler\lib\site-packages\sqlalchemy\util\compat.py", line 183, in reraise raise value.with_traceback(tb)
  File "C:\Users\skuo\apshcduler\lib\site-packages\sqlalchemy\engine\base.py", line 1139, in _execute_context context)
  File "C:\Users\skuo\apshcduler\lib\site-packages\sqlalchemy\engine\default.py", line 450, in do_execute cursor.execute(statement, parameters)
  File "C:\Users\skuo\apshcduler\lib\site-packages\pymysql\cursors.py", line 158, in execute result = self._query(query)
  File "C:\Users\skuo\apshcduler\lib\site-packages\pymysql\cursors.py", line 308, in _query conn.query(q)
  File "C:\Users\skuo\apshcduler\lib\site-packages\pymysql\connections.py", line 820, in query self._affected_rows = self._read_query_result(unbuffered=unbuffered)
  File "C:\Users\skuo\apshcduler\lib\site-packages\pymysql\connections.py", line 1002, in _read_query_result result.read()
  File "C:\Users\skuo\apshcduler\lib\site-packages\pymysql\connections.py", line 1285, in read first_packet = self.connection._read_packet()
  File "C:\Users\skuo\apshcduler\lib\site-packages\pymysql\connections.py", line 946, in _read_packet packet_header = self._read_bytes(4)
  File "C:\Users\skuo\apshcduler\lib\site-packages\pymysql\connections.py", line 982, in _read_bytes 2013, "Lost connection to MySQL server during query")
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') [SQL: 'SELECT apscheduler_jobs.id, apscheduler_jobs.job_state \nFROM apscheduler_jobs \nWHERE apscheduler_jobs.next_run_time <= %(next_run_time_1)s ORDER BY apscheduler_jobs.next_run_time'] [parameters: {'next_run_time_1': 1457445220.361246}]

кто-нибудь знает, что с этим случилось? и как это исправить?


person shan kuo    schedule 08.03.2016    source источник
comment
какова настройка интерактивного_таймаута   -  person Bernd Buffen    schedule 08.03.2016


Ответы (1)


какова настройка интерактивного_таймаута?

время ожидания:

Описание: время в секундах, в течение которого сервер ожидает, пока соединение станет активным, прежде чем закрыть его. Значение сеанса инициализируется, когда поток запускается либо из глобального значения, если соединение неинтерактивное, либо из значения интерактивного_времени ожидания, если соединение интерактивное.

person Bernd Buffen    schedule 08.03.2016
comment
Спасибо за ответ. Я проверяю, что «interactive_timeout» равен 28800. И я устанавливаю для обеих переменных (wait_timeout, Interactive_timeout) значение 60, но та же ошибка все еще возникает. - person shan kuo; 09.03.2016
comment
вы должны установить оба выше, например 3600 (1h), какую версию вы используете SELECT VERSION(); - person Bernd Buffen; 09.03.2016
comment
ВЫБЕРИТЕ ВЕРСИЮ(); -> 5.5.46-0ubuntu0.14.04.2. И почему эти два таймаута нужно устанавливать выше? - person shan kuo; 09.03.2016
comment
если ваша работа подключается к БД и ничего не делает с БД, более длительный таймер, такой как cron, БД закроет соединение, и если ваша работа будет использовать его позже, он будет закрыт - person Bernd Buffen; 09.03.2016
comment
Хорошо, я вижу. Я думаю, может быть, ошибка в том, что апшедулер не закрывает соединение с базой данных. Потому что, когда я использую sqlalchemy, я использую функцию .close() после запроса, и она возвращает это соединение в пул соединений. Если активируется следующий запрос и БД закроется, будет создано новое подключение к БД. Ваш ответ мне очень помогает! Спасибо! - person shan kuo; 09.03.2016