Почему я продолжаю получать тайм-аут sqlalchemy, используя flask -login в моем flask приложении? - PullRequest
0 голосов
/ 19 января 2020

Я запускаю Flask веб-приложение в Docker рое, которое использует Flask -Login для аутентификации пользователя. У меня смоделирован класс User, и я использую Flask -SQLAlchemy, чтобы подключить приложение к базе данных Postgres, расположенной в экземпляре AWS RDS db.

Flask -Login ожидает размещения функции в вашем классе модели для поиска пользователя по его идентификатору, определенному следующим образом:

@login.user_loader
def load_user(id):
    return User.query.get(int(id))

Flask -Login затем использует эту функцию для вызова вашей модели пользователя, чтобы получить информацию о текущем пользователе, хранящемся в сеанс.

В большинстве случаев все работает нормально, но время от времени я сталкиваюсь с проблемой, когда этот вызов приводит к разрыву соединения Postgres. Это происходит как при подключении к экземпляру AWS postgres, так и при локальном запуске Docker экземпляра Postgres.

AWS ошибка тайм-аута:

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) SSL SYSCALL error: EOF detected

[SQL: SELECT users.id AS users_id, users.name AS users_name, ***TRIMMED*** 
FROM users 
WHERE users.id = %(param_1)s]
[parameters: {'param_1': 14}]
(Background on this error at: http://sqlalche.me/e/e3q8)

Docker (Локальная БД) Тайм-аут:

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) server closed the connection unexpectedly
    This probably means the server terminated abnormally
    before or while processing the request.

[SQL: SELECT users.id AS users_id, users.name AS users_name, ***TRIMMED*** 
FROM users 
WHERE users.id = %(param_1)s]
[parameters: {'param_1': 14}]
(Background on this error at: http://sqlalche.me/e/e3q8)

Я натолкнулся на этот пост , в котором говорилось об использовании параметра pool_pre_ping в SQLAlchemy, который в основном делает sqlalchemy всегда проверять соединение, прежде чем продолжить (подробнее здесь ). Поэтому я обновил свой экземпляр flask -sqlalchemy, чтобы отразить это.

db = SQLAlchemy(engine_options={'pool_pre_ping': True})

Я все еще сталкиваюсь с проблемой, хотя ... хотя и не так часто. У кого-нибудь есть идеи? Я знаю, что, скорее всего, это как-то связано с тем, как SQLAlchemy объединяет соединения, но я просто не знаю, что именно.

1 Ответ

0 голосов
/ 19 января 2020

Не уверен, поможет ли это, но у меня есть следующее в моей строке подключения SQLAlchemy (обратите внимание на pool_recycle) ...

# pool_recycle manages situation where mysql automatically disconnects after 8 hours of inactivity    
qry_engine = create_engine('mysql+mysqlconnector://root:root@localhost:3306/', pool_recycle=3600, echo=False)

Я в значительной степени любитель с SQLAlchemy, но я получил это из документации некоторое время go и просто вставил это как само собой разумеющееся. Я также только что заметил, что это может быть mySQL -specifi c. Я не слишком углубился в то, что происходит через 3600 минут.

...