Производительность Mongodb с драйвером C # mongodb - PullRequest
1 голос
/ 14 мая 2019

У меня есть основное приложение .net, в котором я использую c # и MongoDB.В приложении я использую драйвер MongoDB (версия 2.7) для любой операции, связанной с базой данных, и у меня есть база данных MongoDB (версия 4.0.9).Я сталкиваюсь с одной странной проблемой и не могу найти причину ее возникновения.Самый первый запрос к базе данных занимает значительно больше времени, чем последующие запросы.Например, если первый запрос занимает 1 секунду, и если мы сразу же отправляем больше запросов, то это занимает ~ 200-250 миллисекунд

Кто-нибудь знает решение вышеописанной ситуации?

1 Ответ

1 голос
/ 14 мая 2019

это не ошибка. это поведение по умолчанию для драйвера c #. драйвер устанавливает соединение с сервером базы данных только тогда, когда инициируется самая первая операция, и для установления соединения потребуется несколько сотен миллисекунд.

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

я предлагаю просто игнорировать время, необходимое для инициализации соединения, если вы проводите какие-либо тесты / тесты.

UPDATE:

если ваша база данных размещена в сети, что-то вроде брандмауэра может мешать свободным соединениям. в этом случае вы можете попробовать выполнить следующее, чтобы пустые соединения перерабатывались / обновлялись каждую минуту.

MongoDefaults.MaxConnectionIdleTime = TimeSpan.FromMinutes(1)

если все остальное не работает, единственная оставшаяся опция, о которой я могу подумать, это запустить задачу keep-alive, как показано ниже:

        public void InitKeepAlive()
        {
            Task.Run(async () =>
            {
                while (true)
                {
                    await client.GetCollection<Document>("Documents")
                                .AsQueryable()
                                .Select(d => d.Id)
                                .FirstOrDefaultAsync();
                    await Task.Delay(TimeSpan.FromMinutes(1));
                }
            });            
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...