flask-sqlalchemy 使用中mysql gone sway的情况;其实归根结底的原因就是数据库服务端的连接已经断开或者连接过多未承载下来导致数据库客户端连接池有些连接已经不可用了但是没有被recycle回收到
原因:celery里边的连接用完必须close释放回连接池,因为celery任务会共用同一个数据库连接不释放的话这个连接可能在数据库服务端已经关掉(超过mysql服务端連接超时时间),但是celery任务执行每次都使用这个一直存在的连接其实可能早就被mysql服务器断掉所以出现mysqlhave gone awayy。
解释下为什么释放连接回到数据库連接池就可以避免出现mysqlhave gone awayy
sqlalchemy连接池在每次有数据库操作请求获取连接checkout的时候会进行一次recycle将空闲连接回收掉(所以设置SQLALCHEMY_POOL_RECYCLE配置的时候一定要小于数据庫服务端的连接超时时间这样才能保证在数据库服务器关掉超时连接的情况下flask app客户端获取这个数据库连接的时候被回收掉),_checkout中获取连接源码如下:
原因: 并发较高服务端连接不够用;因为flask的view请求处理完会自动close数据库连接,所以不需要我们自己去close
解决方法:增加redis缓存,這边主要是读多写少的场景数据有更新的时候同步刷缓存(基于singal信号通知),每次读的时候尽量从缓存读