Я использую драйвер node-mongodb-native с MongoDB для написания веб-сайта.
У меня есть несколько вопросов о том, как управлять соединениями:
Достаточно ли использовать только одно подключение MongoDB для всех запросов? Есть ли проблемы с производительностью? Если нет, могу ли я установить глобальное соединение для использования во всем приложении?
Если нет, то хорошо ли мне открывать новое соединение при поступлении запроса и закрывать его при обработке запроса? Это дорого, чтобы открыть и закрыть соединение?
Должен ли я использовать глобальный пул соединений? Я слышал, что драйвер имеет собственный пул соединений. Это хороший выбор?
Если я использую пул соединений, сколько соединений нужно использовать?
Есть ли другие вещи, на которые я должен обратить внимание?
Ответы:
Основной коммиттер для node-mongodb-native говорит :
Итак, чтобы ответить на ваш вопрос напрямую, повторно используйте объект db, полученный в результате
MongoClient.connect()
. Это обеспечивает объединение в пул и обеспечивает заметное увеличение скорости по сравнению с открытием / закрытием соединений при каждом действии БД.источник
req.db
этом промежуточном программном обеспечении: github.com/floatdrop/express-mongo-dbОткройте новое соединение при запуске приложения Node.js и повторно используйте существующий
db
объект соединения:/server.js
/api/users.js
Источник: Как открыть соединения с базой данных в приложении Node.js / Express
источник
Вот код, который будет управлять вашими подключениями MongoDB.
Когда вы запускаете сервер, звоните
initPool
Затем в любом другом модуле вы можете сделать следующее:
Это основано на документации MongoDB . Взгляни на это.
источник
Управляйте пулами соединений Монго в одном автономном модуле. Этот подход обеспечивает два преимущества. Во-первых, это делает ваш код модульным и более простым для тестирования. Во-вторых, вам не нужно смешивать соединение с базой данных в объекте запроса, который НЕ является местом для объекта соединения с базой данных. (Учитывая природу JavaScript, я считаю очень опасным смешивать что-либо с объектом, созданным библиотечным кодом). Так что с этим вам нужно только рассмотреть модуль, который экспортирует два метода.
connect = () => Promise
иget = () => dbConnectionObject
.С помощью такого модуля вы можете сначала подключиться к базе данных
Когда в полете ваше приложение может просто позвонить,
get()
когда ему нужно соединение с БД.Если вы настроите свой модуль БД таким же образом, как показано ниже, у вас будет не только способ гарантировать, что ваше приложение не будет загружаться, если у вас нет подключения к базе данных, у вас также есть глобальный способ доступа к пулу подключений к базе данных, который приведет к ошибке если у вас нет связи.
источник
get()
мы получаем пул соединений, а не одно соединение. Пул соединений, как следует из его названия, представляет собой логическую коллекцию соединений с базой данных. Если в пуле нет соединений, драйвер попытается их открыть. Как только это соединение открыто, оно используется и возвращается в пул. При следующем обращении к пулу это соединение может быть использовано повторно. Приятно то, что пул будет управлять нашими соединениями для нас, поэтому, если соединение будет сброшено, мы никогда не узнаем, так как пул откроет для нас новое.Если у вас есть Express.js, вы можете использовать express-mongo-db для кэширования и совместного использования соединения MongoDB между запросами без пула (поскольку в принятом ответе говорится, что это правильный способ поделиться соединением).
Если нет - вы можете посмотреть на его исходный код и использовать его в другом фреймворке.
источник
Я использовал generic-pool с подключениями redis в своем приложении - я очень рекомендую его. Он универсален, и я точно знаю, что он работает с mysql, поэтому я не думаю, что у вас возникнут какие-либо проблемы с ним и монго
https://github.com/coopernurse/node-pool
источник
Вы должны создать соединение как сервис, а затем использовать его при необходимости.
мой пример App.js
и использовать его где угодно
источник
Я реализовал приведенный ниже код в своем проекте, чтобы реализовать пул соединений в моем коде, чтобы он создал минимальное соединение в моем проекте и повторно использовал доступное соединение
источник
Лучший подход для реализации пула соединений - вы должны создать одну переменную глобального массива, которая будет содержать имя базы данных с объектом соединения, возвращенным MongoClient, а затем повторно использовать это соединение всякий раз, когда вам нужно связаться с базой данных.
В вашем Server.js определите var global.dbconnections = [];
Создайте сервис именования connectionService.js. У него будет 2 метода getConnection и createConnection. Поэтому, когда пользователь вызовет getConnection (), он найдет детали в глобальной переменной соединения и вернет детали соединения, если уже существует, иначе он вызовет createConnection () и вернет детали соединения.
Вызовите этот сервис, используя db_name, и он вернет объект соединения, если он уже есть, он создаст новое соединение и вернет его вам.
Надеюсь, поможет :)
Вот код connectionService.js:
источник
mongodb.com -> новый проект -> новый кластер -> новая коллекция -> подключиться -> IP-адрес: 0.0.0.0/0 & db cred -> подключить ваше приложение -> скопировать строку подключения и вставить в файл .env вашего узла приложение и убедитесь, что заменили "" на действительный пароль для пользователя, а также замените "/ test" на ваше имя базы данных
создать новый файл .env
источник
При использовании Express есть еще один более простой метод, который заключается в использовании встроенной функции Express для обмена данными между маршрутами и модулями в вашем приложении. Есть объект с именем app.locals. Мы можем прикрепить к нему свойства и получить к нему доступ внутри наших маршрутов. Чтобы использовать его, создайте экземпляр вашего монго-соединения в файле app.js.
Это соединение с базой данных или любые другие данные, которыми вы хотите поделиться вокруг модулей вашего приложения, теперь могут быть доступны по вашим маршрутам,
req.app.locals
как показано ниже, без необходимости создавать и требовать дополнительных модулей.Этот метод гарантирует, что у вас есть соединение с базой данных, открытое на время вашего приложения, если вы не решите закрыть его в любое время. Он легко доступен
req.app.locals.your-collection
и не требует создания каких-либо дополнительных модулей.источник