Избегание «сервера MySQL ушло» на редко используемом сервере Python / Flask с SQLAlchemy

Как можно настроить Flask / SQLAlchemy для создания нового подключения к базе данных, если его нет?

У меня есть редко посещаемый сервер Python / Flask, который использует SQLAlchemy. Он посещается каждые пару дней, и при первом посещении он часто выдает ошибку «сервер MySQL ушел». Последующие просмотры страниц прекрасны, но для этой первоначальной ошибки это выглядит непрофессионально.

Я хотел бы знать правильный способ справиться с этим – совет, как «сделать очень длинный тайм-аут», который в этом случае составляет около 4 дней, не кажется правильным. Как я могу проверить отсутствие соединения с базой данных и создать его, если необходимо?

4 Solutions collect form web for “Избегание «сервера MySQL ушло» на редко используемом сервере Python / Flask с SQLAlchemy”

У меня были проблемы с этим раньше, и я обнаружил, что способ справиться с этим – это не проводить сеансы. Проблема в том, что вы пытаетесь слишком долго поддерживать соединение. Вместо этого используйте сеанс локального локального потока, например, в __init__.py или в пакете служебных программ, который вы импортируете везде:

 from sqlalchemy.orm import scoped_session, sessionmaker Session = scoped_session( sessionmaker() ) 

Затем настройте свои двигатели и метаданные один раз. Это позволяет пропустить механику конфигурации при каждом подключении / отключении. После этого вы можете сделать свою работу db следующим образом:

 session = Session() someObject = session.query( someMappedClass ).get( someId ) # use session like normal ... session.close() 

Если вы хотите сохранить старые объекты, и вы не хотите оставлять сессию открытой, вы можете использовать описанный выше шаблон и повторно использовать старые объекты, например:

 session = Session() someObject = session.merge( someObject ) # more db stuff session.close() 

Дело в том, что вы хотите открыть сеанс, выполнить свою работу, а затем закрыть сеанс. Это позволяет избежать перерывов во времени. Существует множество опций для .merge и .add, которые позволяют либо включать изменения, внесенные вами в отдельные объекты, либо загружать новые данные из db. Документы очень подробные, но как только вы знаете, что вы ищете, это может быть немного легче найти.

Чтобы на самом деле пройти весь путь и не позволить MySQL «уйти», вам нужно решить проблему вашего пула соединений, чтобы соединения были открыты слишком долго и проверяли для вас старое соединение.

Чтобы получить новое соединение, вы можете установить параметр pool_recycle в своем вызове create_engine . Установите этот pool_recycle на количество секунд в пуле соединений между проверками, которые вы хотите создать новое соединение, вместо того, чтобы существующее соединение было возвращено.

У меня была аналогичная проблема, но для меня я получаю ошибку «MySQL ушел» где-то между 5 и 2 часами каждой сессии.

Я использую Flask-SQLAlchemy, поэтому он должен закрывать незанятые соединения, но, похоже, не делал этого, если соединение не простаивало в течение нескольких часов.

В конце концов я сузил его до следующих настроек Flask-SQLAlchemy:

 app.config['SQLALCHEMY_POOL_SIZE'] = 100 app.config['SQLALCHEMY_POOL_RECYCLE'] = 280 

По умолчанию для них установлены 10 и 7200 (2 часа) соответственно.

Это вопрос игры с этими настройками в соответствии с вашей средой.

Например, во многих местах я бы читал, что для SQLALCHEMY_POOL_RECYCLE должно быть установлено значение 3600, но это не сработало для меня. Я хожу с PythonAnywhere, и они убивают бездействующие соединения MySQL через 5 минут (300 секунд). Таким образом, установка моего значения до менее чем 300 решила проблему.

Надеюсь, это поможет другим, потому что я потратил слишком много времени на эту проблему.

http://flask-sqlalchemy.pocoo.org/2.1/config/#configuration-keys

ЕСЛИ вы используете Flask-SQLAlchemy:

Кажется, что исправление доступно: https://github.com/mitsuhiko/flask-sqlalchemy/issues/2

К сожалению, установленная по умолчанию установка (pip install flask-sqlalchemy) не применила исправление должным образом, особенно по этой проблеме: https://github.com/e-dard/flask-sqlalchemy/commit/cf659f346e005d34257d256fa4c42889741fc31f

Получение последней версии из github должно исправить ее.

2017: В SQLAlchemy v1.2.0 + вы можете использовать функцию предварительного пула соединений для решения этой проблемы «сервер MySQL ушел».

Предварительная настройка пула соединений. Пул соединений теперь включает в себя опцию «pre ping», которая будет проверять «живучесть» объединенного соединения для каждой проверки соединения, прозрачно перерабатывая соединение DBAPI, если база данных отключена. Эта функция устраняет необходимость в флаге «перезапуск пула», а также проблему ошибок, возникающих при использовании пула соединения после перезапуска базы данных.

Версия 1.2.0b1 теперь находится здесь, поэтому вы можете использовать ее сегодня; релиз доступен на PyPI, но поскольку в настоящее время он все еще находится в бета-версии, вы должны указать флаг -pre при установке с помощью pip.

  • AttributeError: объект 'int' не имеет атрибута '_sa_instance_state'
  • SQLAlchemy - использование 'aliased' в запросе с пользовательским отношением primaryjoin
  • SQLAlchemy DELETE Ошибка, вызванная наличием как ленивой нагрузки, так и динамической версии того же отношения
  • SQLAlchemy: гибридное выражение с отношением
  • Объект 'Engine' не имеет атрибута 'drivername'
  • SQLAlchemy create_all () не создает таблицы
  • sqlalchemy полиморфные многие-ко-многим
  • SQLAlchemy DateTime часовой пояс
  • UnicodeDecodeError Загрузка с помощью sqlalchemy
  • SQLAlchemy: getter / setter в декларативном классе Mixin
  • Список таблиц базы данных с SQLAlchemy
  • Python - лучший язык программирования в мире.