SQLAlchemy(0.9.8)和mysql-5.6.21-osx10.8-x86_64和MAC OS X 10.3.3(Yosemite)
我一直在断断续续:
InterfaceError: (InterfaceError) 2013: Lost connection to MySQL server during query u'SELECT..... '
我已阅读了一些帖子,大部分案例都是通过将此添加到my.cnf
来解决的 max_allowed_packet = 1024M
对于我试图做的事情应该足够大。这样做之后,我一步一步地打它。把这一行放在/etc/my.cnf:
log-error = "/Users/<myname>/tmp/mysql.err.log"
log-warnings = 3
我希望得到更多细节,但我看到的只是这样:
[Warning] Aborted connection 444 to db: 'dbname' user: 'root' host: 'localhost' (Got an error reading communication packets)
我已经达到了这样的程度,我认为更好的日志记录可能会有所帮助,或者在此之前我还可以尝试其他的东西。
感谢。
答案 0 :(得分:2)
看起来你的MySQL连接在长时间不活动后超时,我敢打赌,如果你不断用现有设置查询你的数据库,它将不会发生。 MySQL和SQL端都有几个设置可以解决这个问题:
检查您的SQLa引擎的pool_recycle
值,尝试不同/更小的值,例如1800(秒)。如果您正在从文件中读取数据库设置,请将其设置为
pool_recycle:1800
否则在引擎初始化期间指定它,例如
from sqlalchemy import create_engine
e = create_engine("mysql://user:pass@localhost/db", pool_recycle=1800)
检查/修改您的wait_timeout
MySQL变量,请参阅https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_wait_timeout,这是服务器在关闭非交互式连接之前等待活动的秒数。 e.g。
显示全局变量,例如&#39; wait_timeout&#39;;
找到适合您环境的组合。
答案 1 :(得分:0)
根据this,this和互联网上许多其他文章的建议,使用以下装饰器包装我的所有功能,帮助我解决了mariadb作为后端数据库的“丢失连接”问题。请注意,下面的db
是flask_sqlalchemy.SQLAlchemy
的实例,但是对于sqlalchemy会话,该概念也将保持相同。
def manage_session(f):
def inner(*args, **kwargs):
# MANUAL PRE PING
try:
db.session.execute("SELECT 1;")
db.session.commit()
except:
db.session.rollback()
finally:
db.session.close()
# SESSION COMMIT, ROLLBACK, CLOSE
try:
res = f(*args, **kwargs)
db.session.commit()
return res
except Exception as e:
db.session.rollback()
raise e
# OR return traceback.format_exc()
finally:
db.session.close()
return inner
我还在Flask SQLAlchemy配置中添加了50秒的pool_recycle,但这显然没有对解决方案有所帮助。