2017-02-18 11 views
0

長時間実行されるCeleryタスク(〜10-120分/タスク、時には低速クエリ)を起動するFlaskアプリケーションがあります。 ORMと接続管理にFlask-SQLAlchemyを使用します。私のアプリは、次のようになります。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 
関連する問題