簡體   English   中英

Flask + Celery + SQLAlchemy:數據庫連接超時

[英]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_TIMEOUTSQLALCHEMY_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM