Есть ли способ создать набор X-подключений к mongodb с помощью MongoClient при запуске приложения?

Я хочу создать «X» подключений к mongodb при запуске моего приложения (т.е. до того, как мое приложение начнет получать трафик).

Версия MongoDB: 4.0.11

Версия драйвера Mongo Java (maven): 3.4.1

Я попытался установить «minConnectionsPerHost» на требуемое число, но когда я выполняю код, он едва открывает 1 или 2 соединения. Но когда я загружаю свое приложение, количество подключений медленно увеличивается, чтобы приспособиться к трафику. Я хочу создать эти соединения до того, как мое приложение начнет получать трафик.

        ServerAddress address = new ServerAddress("localhost", 27017);
        List<ServerAddress> serverAddresses = Arrays.asList(address);

        MongoCredential credential = 
        MongoCredential.createCredential("XXXX", "XXXX", 
              "XXXX".toCharArray());
        List<MongoCredential> mongoCredentials = 
              Arrays.asList(credential);

        MongoClientOptions clientOptions = 
              MongoClientOptions.builder().connectionsPerHost(100).
              minConnectionsPerHost(50).build();
        MongoClient mongoClient = new MongoClient(serverAddresses, 
              mongoCredentials, clientOptions);

Есть ли способ добиться этого с помощью драйвера Java mongo?


person Vinil    schedule 02.08.2019    source источник
comment
ты имеешь в виду connection pool?   -  person emotionlessbananas    schedule 02.08.2019
comment
Я думаю, что внутренне он уже создает для вас много подключений и очередей. Таким образом, если одно соединение занято получением информации, ваше приложение может использовать другое соединение в очереди для получения другой информации. И все это с кодом, который у вас уже есть.   -  person Faraz    schedule 02.08.2019
comment
объекты подключения тяжелые, и именно поэтому они не создаются заранее и не сохраняются. Пул соединений — это распространенная стратегия, используемая в соединениях с базой данных. Почему вы считаете, что это должно быть создано заранее?   -  person Kris    schedule 02.08.2019
comment
@FarazDurrani Есть ли способ проверить это? Когда я объясняю статистику сервера на mongo db, я вижу только одно соединение. db.serverStatus().connections { "current" : 1, "available" : 203, "totalCreated" : 29, "active" : 1 }   -  person Vinil    schedule 02.08.2019
comment
@Vinil, пожалуйста, посмотрите на этот тред размер пула соединений">stackoverflow.com/questions/24557774/   -  person emotionlessbananas    schedule 02.08.2019
comment
Статистика сервера @Vinil показывает количество активных клиентов, которые подключены. Вы можете увидеть доступные соединения как 203. Всего ранее было создано 29 соединений. Соединения закрываются, когда они простаивают. Держать соединения открытыми — не очень хорошая идея, если у вас высокий уровень параллелизма.   -  person Kris    schedule 02.08.2019
comment
@Kris У меня есть требование, когда наблюдается огромный всплеск трафика, и я заметил, что первые несколько сотен запросов занимают намного больше времени, чем ожидалось. Итак, я хотел создать эти соединения заранее, чтобы приложение было лучше оснащено для обслуживания трафика.   -  person Vinil    schedule 02.08.2019
comment
Из того, что я видел, вы можете установить minConnectionsPerHost() в параметрах, а затем использовать сценарий прогрева для создания множества соединений. Пул соединений будет поддерживать соединения minConnectionsPerHost без закрытия.   -  person Kris    schedule 02.08.2019
comment
@Kris Спасибо за предложение. Не могли бы вы подробнее рассказать о сценарии разогрева? Это что-то, что можно сделать в приложении? Кроме того, как мы можем создавать эти соединения по отдельности?   -  person Vinil    schedule 02.08.2019


Ответы (1)


Вы можете установить minConnectionsPerHost() в построителе параметров, а затем использовать сценарий прогрева для создания множества соединений. Пул соединений будет поддерживать соединения minConnectionsPerHost без закрытия.

Сценарий прогрева может иметь программу, которая порождает количество потоков 2*minConnectionsPerHost, которые будут подключаться и выполнять фиктивную операцию чтения. Таким образом, соединения будут открыты, минимальные соединения будут поддерживаться.

Это кажется грязным решением :-) Но может сработать!

person Kris    schedule 02.08.2019