Как эффективно использовать соединения MongoClient в Django с помощью PyMongo?

Я работаю над проектом, используя Django версии 3.0.8 и PyMongo версии 3.11.3. В настоящее время для каждого входящего запроса создается новое соединение MongoClient, которое уничтожается после обработки запроса. Например:

def get_all_logs(request):
    req = json.loads(request.body.decode('utf-8'))
    record_id = str(req.get('record_id')).strip()
    with NewMongoClient(db='space').db() as db:
        log_info_with_record_id = list(db.database_alternative.find({'recordID': record_id}))

Здесь NewMongoClient - это класс-обертка вокруг pymongo.MongoClient. Я думаю, что такой подход приводит к слишком большим накладным расходам из-за постоянного создания и уничтожения соединений. Есть ли более эффективный способ повторного использования соединений MongoClient для разных запросов?

Да, создание новых MongoClient для каждого запроса может быть довольно ресурсоемким.

Вы можете использовать решение Singleton для создания MongoClient:

# get_mongo_client.py

from pymongo import NewMongoClient

mongo_client = None

def get_mongo_client():
    global mongo_client
    if mongo_client is None:
        mongo_client = NewMongoClient(db='space')
    return mongo_client

После этого вы можете использовать это в своих view.py:

# views.py

from .mongo_client import get_mongo_client

def my_view(request):
    client = get_mongo_client()
    with client.db() as db:
        
    ...

Потокобезопасное решение:

from pymongo import MongoClient
import threading

mongo_client = None
mongo_client_lock = threading.Lock()

def get_mongo_client():
    global mongo_client
    if mongo_client is None:
        with mongo_client_lock:
            if mongo_client is None:
                mongo_client = MongoClient('mongodb://localhost:123/')
    return mongo_client
Вернуться на верх