Когда драйвер MongoDB Java устанавливает соединение?

Я использую последний драйвер Java (2.11.1) для MongoDB. MongoDB Java API по сути является

  • Один экземпляр класса MongoClient (с внутренним пулом соединений)
  • getDB() для получения объекта БД
  • getCollection() для получения объекта DBCollection

1) Когда устанавливается соединение с БД? Это когда вызывается getDB() или вызывается getCollection()?

2) Лучше вызывать getDB() один раз или каждый раз, когда вам нужно? (имеет ли это значение? - MongoClient хранит объект БД в кэше?)

3) Лучше ли повторно использовать один объект DBCollection несколькими потоками или вызывать getCollection() из нескольких потоков? (Кэшируется ли DBCollection?)


person shicky    schedule 06.06.2013    source источник
comment
Есть простой тест, чтобы узнать: создайте main(), который выполняет простой запрос, с закрытой MongoDB, и посмотрите, где он блюет :p   -  person fge    schedule 06.06.2013


Ответы (2)


Класс MongoClient управляет пулом подключений с отложенной загрузкой из вашего клиентского приложения в кластер MongoDB. Вы можете инициализировать MongoClient с определенным количеством соединений на хост, а также числом потоков, ожидающих соединения. Поскольку MongoClient управляет как количеством подключений, так и параллелизмом потоков, вы захотите использовать один экземпляр класса на виртуальную машину. И DB, и DBCollection выполняют свои операции через пул соединений MongoClient, поэтому по этой причине нет необходимости их кэшировать. Количество объектов DB или DBCollection, которые вы создаете, не ограничено. Однако, поскольку эти классы потокобезопасны и могут быть установлены с определенными предпочтениями чтения и записи, вы можете использовать один экземпляр класса DB или DBCollection для выполнения нескольких операций.

person Bryan Reinero    schedule 11.06.2013

1) соединение устанавливается, когда мы выполняем какую-либо операцию (найти, обновить, удалить и т.д.)

2) Док говорит: «Обычно вы создаете только 1 экземпляр для данного кластера базы данных и используете его в своем приложении». Таким образом, нет смысла кэшировать объект БД, и он также не кэшируется в коде драйвера.

3) DBCollection и DB потокобезопасны. DBCollection кэшируются в классе DBApiLayer в драйвере.

person Abhishek Kumar    schedule 06.06.2013
comment
Док говорит, что для каждой JVM должен быть один экземпляр MongoClient. Как это связано с кэшированием объекта БД или DBCollection. - person shicky; 06.06.2013
comment
Объект БД — это то, что является логическим представлением фактической базы данных. Может быть, мой используемый язык неверен, да, детали БД должны быть кэшированы, но это всего лишь 1 объект БД на MongoClient, но много DBCollection на БД. - person Abhishek Kumar; 07.06.2013