[英]Flask + Celery + SQLAlchemy: database connection timeout
我有一個Flask應用程序來啟動長時間運行的Celery任務(每任務約10-120分鍾,有時查詢速度很慢)。 我將Flask-SQLAlchemy用於ORM和連接管理。 我的應用程序如下所示:
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服務器喜歡在幾分鍾不活動后關閉連接,而celery任務無法處理這種情況,因此在等待了很多時間后,我收到了(2006年,“ MySQL服務器已消失”)錯誤。 AFAIK連接池應該處理關閉的連接。 我閱讀了文檔 ,但只寫了有關SQLALCHEMY_POOL_TIMEOUT
和SQLALCHEMY_POOL_RECYCLE
參數的內容,因此根據一些隨機的互聯網文章,我嘗試將回收時間更改為3分鍾,但這並沒有幫助。
連接(會話?)處理如何與此配置一起工作? 我應該怎么做才能避免此類錯誤?
我不能完全確定以下解決方案的好處,但似乎可以解決問題。
會話在第一個查詢(或插入)語句之前初始化連接並啟動事務。 然后它等待回滾或提交,但是由於不活動,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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.