2017-12-19 5 views
1

セロリーを学ぶには、Celery Best Practicesと読んでください。セロリーでのデータベース使用については、非常に簡単な質問があります。セロリの労働者のmongodbに正しく接続する方法は?

デニBertovicは言う:

あなたがシリアライズされたオブジェクトが古い データが含まれている可能性があるため、バックグラウンドタスクを する(例えば、あなたのUserモデルのための)データベースオブジェクトを渡すべきではありません。

@app.task 
def add(x, y, collection): 
    client = MongoClient('mongodb://localhost:27017/') 
    db = client.wakawaka 
    db[collection].insert_one({'sum':x+y}) 
    return True 

か::

client = MongoClient('mongodb://localhost:27017/') 
db = client.wakawaka 

@app.task 
def add(x, y, collection): 
    db[collection].insert_one({'sum':x+y}) 
    return True 

私は労働者でデータベースに接続する場合

ので、正しい選択とは何でしょうか?

UPD:私は、私が何かを必要とするたびに、タスクは新鮮なDBに接続し、そして何のリソースが無駄にならない、すべてのタスクの終了時に、私のMongoDB接続をclose()することができます。それでも、何度もデータベース接続を開いたり閉じたりする必要がありますか?または私は一度接続して何らかの形で新しいバージョンのDBを取得するために接続をリフレッシュできますか?

答えて

1

トランザクションごとにデータベース接続を開いたり閉じたりすると、トランザクションが独立して実行されるため、古いデータや不正なデータに起因するバグがなくなります。また、データベーストランザクションのライフタイム管理も簡素化されます。

トランザクションを接続コンテキストマネージャブロック内に書き込むことができます。これは、接続を明示的に閉じる必要がないように接続を終了します。スレッドセーフでもあります。例外が発生したときに再試行するために、ビルトイン接続プーリングを利用することもできます。

@app.task 
def add(x, y, collection): 
    with MongoClient('mongodb://localhost:27017') as connection: 
     db = connection.db 
     db.collection.insert_one({'sum':x+y}) 
    return True 
関連する問題