2017-12-19 3 views
1

셀러리를 배우고, Celery Best Practices을 읽고, 샐러리와 데이터베이스 사용에 대해 아주 간단한 질문이 있습니다.셀러리 작업자에서 mongodb에 올바르게 연결하는 방법은 무엇입니까?

데니 Bertovic는 말한다 : 직렬화 된 오브젝트는 오래된 데이터를 포함 할 수 있기 때문에 당신은 에 (예를 들어 귀하의 사용자 모델) 백그라운드 작업을 데이터베이스 오브젝트를 통과하지해야

.

@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

트랜잭션 당 데이터베이스 연결 열기/닫기는 트랜잭션이 독립적으로 수행되므로 부실하거나 잘못된 데이터로 인한 버그를 방지합니다. 또한 데이터베이스 트랜잭션의 수명 관리가 단순화되었습니다.

연결 컨텍스트 관리자 블록 내에서 트랜잭션을 작성할 수 있습니다. 이 연결을 처리하여 명시 적으로 연결을 닫을 필요가 없습니다. 또한 threadsafe입니다. 또한 예외가 발생할 때 기본 제공 연결 풀링을 사용하여 다시 시도 할 수 있습니다.

@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 
관련 문제