数据库连接池mysql gone away问题解决及部分源码分析

flask-sqlalchemy 使用中mysql gone sway的情况;其实归根结底的原因就是数据库服务端的连接已经断开或者连接过多未承载下来导致数据库客户端连接池有些连接已经不可用了但是没有被recycle回收到。

1 现象:celery任务里遇到mysql gone away

原因:celery里边的连接用完必须close释放回连接池,因为celery任务会共用同一个数据库连接,不释放的话这个连接可能在数据库服务端已经关掉(超过mysql服务端连接超时时间),但是celery任务执行每次都使用这个一直存在的连接其实可能早就被mysql服务器断掉,所以出现mysql gone away。

解决方法:celery里执行完数据库操作后db.session.close(),释放连接回到sqlalchemy的连接池。

解释下为什么释放连接回到数据库连接池就可以避免出现mysql gone away

sqlalchemy连接池在每次有数据库操作请求获取连接checkout的时候会进行一次recycle将空闲连接回收掉(所以设置SQLALCHEMY_POOL_RECYCLE配置的时候一定要小于数据库服务端的连接超时时间,这样才能保证在数据库服务器关掉超时连接的情况下flask app客户端获取这个数据库连接的时候被回收掉),_checkout中获取连接源码如下:

2 现象:view里遇到mysql gone away 

原因: 并发较高,服务端连接不够用;因为flask的view请求处理完会自动close数据库连接,所以不需要我们自己去close。

解决方法:增加redis缓存,这边主要是读多写少的场景。数据有更新的时候同步刷缓存(基于singal信号通知),每次读的时候尽量从缓存读。

你可能感兴趣的:(数据库连接池mysql gone away问题解决及部分源码分析)