Soy un novato que ejecuta una aplicación Flask conectada a un servidor remoto MySQL con Flask-SQLAlchemy.

La aplicación tiene muy poco tráfico y es habitual permanecer inactiva durante más de 8 horas, luego me desconecto del servidor MySQL.

Este es mi código de aplicación:

from flask import Flask, render_template, request, redirect, jsonify, make_response
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import or_    

app = Flask(__name__)
app.config['DEBUG'] = True
app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {'pool_pre_ping': True, 'pool_recycle': 300, 'echo':'debug',}
app.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://user:pass@myipcode/db'
db = SQLAlchemy(app)

Todo funciona bien hasta que no se realizan consultas durante 8 horas, luego pierdo la conexión de base de datos y los registros muestran este código de error:

"MySQL server has gone away (%r)" % (e,)) sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2006, "MySQL server has gone away (BrokenPipeError(32, 'Broken pipe'))

Investigué un poco y me aconsejaron que estableciera 'SQLALCHEMY_ENGINE_OPTIONS' como está escrito en el ejemplo de código, pero se comporta de la misma manera con o sin tales opciones de motor, la conexión no se recicla cada 300 segundos como debería, y pool_pre_ping no parece generar ningún resultado. diferencia. La opción 'echo':'debug' funciona según lo previsto ya que obtengo todas las transacciones registradas.

¿Qué debo hacer para evitar que la conexión se desconecte incluso después de un largo período de inactividad?

Editar:

Para agregar información adicional:

La base de datos está alojada en Cloud SQL desde GCP.

Estoy perdido ... Cualquier ayuda sería muy apreciada.

0
Andreu C. 26 oct. 2020 a las 22:15

1 respuesta

La mejor respuesta

Finalmente lo descubrí yo mismo,

Tenía que ver con el hecho de que mi aplicación se estaba ejecutando en un punto de montaje como http://ServerIP/app en lugar de http://ServerIP/ porque inicialmente estaba pensada como un servidor de prueba.

Estaba usando uWSGI y, para que funcione en la ruta antes mencionada, tuve que especificar un parámetro mount en el bloque [UWSGI] del archivo app.ini.

Cuando se inició el servidor uWSGI, parecía que estaba montando dos aplicaciones, una en '' y la otra en '/ app', y supongo que eso creó un conflicto que hizo que la aplicación no pudiera administrar las conexiones en el servidor MySQL.

Montar la aplicación en http://ServerIP/ funcionó de maravilla.

0
Andreu C. 29 oct. 2020 a las 10:05