How to Reuse MongoClient Connections Efficiently in Django with PyMongo?

I'm working on a project using Django version 3.0.8 and PyMongo version 3.11.3. Currently, for each incoming request, a new MongoClient is created, and the connection is destroyed once the request is processed. For example:

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}))

Here, NewMongoClient is a wrapper class around pymongo.MongoClient I think this approach incurs too much overhead due to the constant creation and destruction of connections. Is there a more efficient way to reuse MongoClient connections across requests?

Yea, creating new MongoClient for each request can be quite resource-intensive.

You could use Singleton solution for creating 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

After this, you could use this in your view.py:

# views.py

from .mongo_client import get_mongo_client

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

Thread-safe solution:

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
Back to Top