Конфигурация MongoDB в веб-приложении Java

Мне нужен совет о том, как правильно настроить mongoDB для моего веб-приложения, работающего с java. Из учебника по mongoDB я понимаю, что у меня должен быть только один экземпляр класса Mongo.

Класс Mongo предназначен для потокобезопасности и совместного использования между потоками. Обычно вы создаете только 1 экземпляр для данного кластера БД и используете его в своем приложении.

Итак, у меня есть для этого одноэлементный провайдер (я использую guice для инъекций)

@Singleton
public class MongoProvider implements Provider<Mongo> {
    private Mongo mongo;

    public Mongo get() {
        if (mongo == null)
            mongo = new Mongo("localhost", 27017);
        return mongo;
    }
}

И всякий раз, когда мне приходится работать с монго в моем веб-приложении, я внедряю провайдера и получаю тот же экземпляр монго.

public class MyService {
    private Provider<Mongo> mongoProvider;

    @Inject
    private MyService(Provider<Mongo> mongoProvider) {
        this.mongoProvider = mongoProvider;
    }

    public void execute() {
        DB db = mongoProvider.get().getDB("mydatabase");
        DBCollection coll = db.getCollection("mycollection");

        // Do stuff in collection
        ...
    }
}

Что мне кажется странным, так это то, что каждый раз, когда я обращаюсь к своей базе данных, я получаю такие журналы от mongo:

[initandlisten] соединение принято с 192.168.1.33:54297 #15

[initandlisten] соединение принято с 192.168.1.33:54299 #16

До сих пор у меня не было никаких проблем, но мне интересно, является ли это хорошей практикой и не столкнусь ли я с какими-либо проблемами, когда количество принятых соединений станет слишком большим.

  • Должен ли я также иметь только один экземпляр объекта БД для всего моего приложения?
  • Нужно ли мне по-другому настраивать MongoDB для автоматического закрытия соединений через некоторое время? Или мне нужно закрывать соединения вручную? Я кое-что читал об использовании метода close() в Mongo, но я не уверен, когда и нужно ли его вызывать.

Спасибо за совет.


person jonasr    schedule 01.06.2012    source источник


Ответы (2)


Это хорошая практика. Каждый экземпляр Mongo управляет пулом соединений, поэтому в журналах mongod вы увидите несколько соединений, по одному для каждого соединения в пуле. Размер пула по умолчанию — 10, но его можно настроить с помощью поля connectionPerHost в MongoOptions.

Экземпляры Mongo также поддерживают кеш экземпляров БД, поэтому вам не нужно беспокоиться о том, чтобы поддерживать их как синглтоны самостоятельно.

Вам не нужно настраивать Mongo для автоматического закрытия соединений. Вы можете вызвать Mongo#close в нужное время, чтобы закрыть все сокеты в пуле соединений.

person jyemin    schedule 01.06.2012

Основал что-то вроде этого на сайте MondoDB:

«Драйвер Java MongoDB является потокобезопасным. Например, если вы используете его в среде веб-обслуживания, вам следует создать один экземпляр MongoClient, и вы можете использовать его в каждом запросе. Объект MongoClient поддерживает внутренний пул подключений к база данных (размер пула по умолчанию – 10). Для каждого запроса к БД (найти, вставить и т. д.) поток Java получит соединение из пула, выполнит операцию и разорвет соединение. Это означает, что используемое соединение (сокет) может каждый раз быть другим."

И из FAQ от MongoSite, который, я думаю, полностью отвечает на ваш вопрос.

http://docs.mongodb.org/manual/faq/developers/#why-does-mongodb-log-so-many-connection-accepted-events

person AdrianX    schedule 18.04.2013