2017-02-18 233 views
0

我有一个Flask应用程序来启动长时间运行的Celery任务(约10-120分钟/任务,有时候查询速度很慢)。我使用Flask-SQLAlchemy进行ORM和连接管理。我的应用程序是这样的:Flask + Celery + SQLAlchemy:数据库连接超时

app = Flask(__name__) 
db = SQLAlchemy(app) 
celery = make_celery(app) 

@app.route('/start_job') 
def start_job(): 
    task = job.delay() 
    return 'Async job started', 202 

@celery.task(bind=True) 
def job(self): 
    db.session.query(... something ...) 
    ... do something for hours ... 
    db.session.add(... something ...) 
    db.session.commit() 
    return 

不幸的是,MySQL服务器我必须使用喜欢几分钟活动和芹菜任务后关闭连接无法处理的情况,所以经过大量的等待我得到( 2006年,“MySQL服务器已经消失”)错误。 AFAIK连接池应负责关闭连接。我读docs,但它只写了SQLALCHEMY_POOL_TIMEOUTSQLALCHEMY_POOL_RECYCLE参数,所以根据一些随机的互联网文章,我尝试将回收周期更改为3分钟,但这并没有帮助。

连接(会话?)处理如何与此配置一起使用?我该怎么做才能避免这种错误?

回答

0

我不完全确定下面的解决方案的好处,但似乎解决了这个问题。

会话在第一个查询(或插入)语句之前初始化一个连接并启动一个事务。然后它会等待回滚或提交,但由于不活动,MySQL服务器会在几分钟后关闭连接。解决方案是关闭会话,如果您不需要很长时间,SQLAlchemy将为下一个事务打开一个新会话。

@celery.task(bind=True) 
def job(self): 
    db.session.query(... something ...) 
    db.session.close() 
    ... do something for hours ... 
    db.session.add(... something ...) 
    db.session.commit() 
    return 
相关问题