Flask-SQLAlchemy 错误 MySQL 服务器已经消失
Flask-SQLAlchemy error MySQL server has gone away
我是新手 运行 Flask 应用程序连接到 MySQL 带有 Flask-SQLAlchemy 的远程服务器。
应用流量很小,经常闲置8小时以上,然后我就和MySQL服务器断开了。
这是我的应用代码:
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)
一切正常,直到 8 小时未执行任何查询,然后我失去了数据库连接并且日志显示此错误代码:
"MySQL server has gone away (%r)" % (e,)) sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2006, "MySQL server has gone away (BrokenPipeError(32, 'Broken pipe'))
我做了一些研究,并被建议设置 'SQLALCHEMY_ENGINE_OPTIONS',如代码示例中所写,但无论有没有这样的引擎选项,它的行为都一样,连接不会像它应该的那样每 300 秒回收一次,并且 pool_pre_ping 似乎没有任何区别。 'echo':'debug'
选项按预期工作,因为我记录了每笔交易。
我应该怎么做才能防止长时间不活动后连接断开?
编辑:
要添加一些额外的信息:
数据库托管在来自 GCP 的云 SQL 中。
我迷路了...
任何帮助将不胜感激。
最后我自己想通了,
这与我的应用程序 运行 在像 http://ServerIP/app
而不是 http://ServerIP/
这样的挂载点上有关,因为它最初打算用作临时服务器。
我正在使用 uWSGI,为了让它在上述路径中工作,我必须在 app.ini 文件的 [UWSGI]
块中指定一个 mount
参数。
当 uWSGI 服务器启动时,它显示它正在安装两个应用程序,一个在 '' 中,另一个在 '/app' 中,我猜这造成了冲突,使应用程序无法管理 MySQL服务器。
在 http://ServerIP/
中安装应用程序非常有效。
我是新手 运行 Flask 应用程序连接到 MySQL 带有 Flask-SQLAlchemy 的远程服务器。
应用流量很小,经常闲置8小时以上,然后我就和MySQL服务器断开了。
这是我的应用代码:
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)
一切正常,直到 8 小时未执行任何查询,然后我失去了数据库连接并且日志显示此错误代码:
"MySQL server has gone away (%r)" % (e,)) sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2006, "MySQL server has gone away (BrokenPipeError(32, 'Broken pipe'))
我做了一些研究,并被建议设置 'SQLALCHEMY_ENGINE_OPTIONS',如代码示例中所写,但无论有没有这样的引擎选项,它的行为都一样,连接不会像它应该的那样每 300 秒回收一次,并且 pool_pre_ping 似乎没有任何区别。 'echo':'debug'
选项按预期工作,因为我记录了每笔交易。
我应该怎么做才能防止长时间不活动后连接断开?
编辑:
要添加一些额外的信息:
数据库托管在来自 GCP 的云 SQL 中。
我迷路了... 任何帮助将不胜感激。
最后我自己想通了,
这与我的应用程序 运行 在像 http://ServerIP/app
而不是 http://ServerIP/
这样的挂载点上有关,因为它最初打算用作临时服务器。
我正在使用 uWSGI,为了让它在上述路径中工作,我必须在 app.ini 文件的 [UWSGI]
块中指定一个 mount
参数。
当 uWSGI 服务器启动时,它显示它正在安装两个应用程序,一个在 '' 中,另一个在 '/app' 中,我猜这造成了冲突,使应用程序无法管理 MySQL服务器。
在 http://ServerIP/
中安装应用程序非常有效。