Как эффективно использовать соединения 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