Почему драйвер узла MongoDB создает нежелательные соединения?

#node.js #mongodb #mongoose

#node.js #mongodb

Вопрос:

У меня возникла своего рода странная проблема, когда я пытаюсь установить единственное соединение mongodb с базой данных с помощью встроенного драйвера mongodb nodejs версии 3.6.0.

Моя идея состоит в том, чтобы открыть только одно соединение в течение всего сеанса клиента и повторно использовать его в разных маршрутах, которые у меня есть на моем экспресс-сервере, когда я нажимаю на него в первый раз, функция getDatabase создает два соединения, и после этого одно из них закрывается, а другое простаивает, но когда я использую маршрут, второе открывается снова (это похоже на то, что одно соединение просто остается там и ничего не делает).

Я просто хочу, чтобы в моем пуле было открыто одно соединение.

Если вы видите прокомментированный код, который я тестировал с этими опциями, но ни одна из них у меня не работала.

Pd: когда я устанавливаю для socketTimeoutMS значение 5000 мс, создается только одно соединение, но оно автоматически закрывается и повторно открывается каждые 5000 мс, что странно (оно снова открывается само, даже когда я не использую соединение).

Вся эта проблема возникает, когда я устанавливаю для useUnifiedTopology значение true (я не могу установить для него значение false, потому что оно устарело, а другие топологии будут удалены в следующей версии драйвера mdb ndjs)

Вот изображение со странным поведением

Код является:

 import { MongoClient, Db } from 'mongodb';
import { DB_URI } from '../config/config';

// This mod works as DataBase Singleton

let db: Db;

export const getDataBase = async (id: string) => {
  try {
    if (db) {
      console.log('ALREADY CREATED');
      return db;
    } else {
      console.log('CREATING');
      let client: MongoClient = await MongoClient.connect(`${DB_URI}DB_${id}`, {
        useUnifiedTopology: true,
   /*  minPoolSize: 1,
        maxPoolSize: 1,
        socketTimeoutMS: 180000,
        keepAlive: true,
        maxIdleTimeMS:10000
        useNewUrlParser: true,
        keepAlive: true,
        w: 'majority',
        wtimeout: 5000,
        serverSelectionTimeoutMS: 5000,
        connectTimeoutMS: 8000,
        appname: 'myApp',
        */
      });

      db = client.db();
      return db;
    }
  } catch (error) {
    console.log('DB Connection error', error);
  }
};
  

Ответ №1:

Драйвер внутренне создает одно соединение для каждого известного сервера в целях мониторинга. Это соединение не используется для операций приложения.

Следовательно, ожидается, что вы получите два установленных соединения.

Комментарии:

1. Спасибо, я обнаружил это вчера, это ответ.