2017-02-18 231 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 
相關問題