Mongodb открытая проблема соединения

6

У меня есть следующий журнал в моей консоли mongo:

Tue Jul 23 17:20:01.301 [initandlisten] waiting for connections on port 27017
Tue Jul 23 17:20:01.401 [websvr] admin web console waiting for connections on port 28017
Tue Jul 23 17:20:01.569 [initandlisten] connection accepted from 127.0.0.1:58090 #1 (1 connection now open)
Tue Jul 23 17:20:01.570 [initandlisten] connection accepted from 127.0.0.1:58089 #2 (2 connections now open)
Tue Jul 23 17:20:21.799 [initandlisten] connection accepted from 127.0.0.1:58113 #3 (3 connections now open)
....
....
....

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

public static DB getConnection(String databaseName) throws AppConnectionException {

    if (null != db) {
        Logger.debug("Returning existing db connection...!");
        return db;
    }

    Logger.debug("Creating new db connection...!");
    final String connStr = PropertyRetreiver.getPropertyFromConfigurationFile("rawdata.url");

    try {

        final MongoClientURI uri = new MongoClientURI(connStr);
        final MongoClient client = new MongoClient(uri);
        db = client.getDB(databaseName);

    } catch (UnknownHostException e) {
        throw new AppConnectionException(
                "Unable to connect to the given host / port.");
    }

    return db;
}
  • 0
    Есть несколько методов? Можете ли вы сделать это synchronized ?
  • 0
    Мои DAO будут вызывать этот метод класса соединителя для получения соединения. Также это соединение является статическим одноэлементным, поэтому я ожидаю, что оно будет иметь только одно соединение в данный момент времени ... Итак, зачем мне здесь синхронизироваться ???
Теги:

1 ответ

8

У MongoClient есть внутренний пул подключений. Можно настроить максимальное количество подключений (по умолчанию - 100). Вы можете установить его, используя MongoClientOptions следующим образом:

MongoClientOptions options = MongoClientOptions.builder()
                .connectionsPerHost(100)
                .autoConnectRetry(true)
                .build();

И затем дайте эти параметры MongoClient (отметьте его в Mongo Java API v2.11.1). Соединения в пуле поддерживаются открытыми (открытие и закрытие соединения обычно являются дорогостоящей операцией), чтобы впоследствии их можно было повторно использовать.

Я бы также реорганизовал ваш singleton-клиент MongoDB с помощью enum, например, чтобы не помещать synchronized в этот метод.

Вот эскиз того, что я имею в виду:

public enum MongoDB {
    INSTANCE;

    private static final String MONGO_DB_HOST = "some.mongohost.com";
    private Mongo mongo;
    private DB someDB;

    MongoDB() {

        MongoClientOptions options = MongoClientOptions.builder()
                .connectionsPerHost(100)
                .autoConnectRetry(true)
                .readPreference(ReadPreference.secondaryPreferred())
                .build();

        try {
            mongo = new MongoClient(MONGO_DB_HOST, options);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }

        someDB = mongo.getDB("someDB");
         //authenticate if needed
         //boolean auth = someDB.authenticate("username", "password".toCharArray());
         //if(!auth){
         //     System.out.println("Error Connecting To DB");
         //}        
    }

    public DB getSomeDB() {
        return someDB;
    }

    //call it on your shutdown hook for example 
    public void close(){
        mongo.close();
    }
}

Затем вы можете получить доступ к своей базе данных через

MongoDB.INSTANCE.getSomeDB().getCollection("someCollection").count();
  • 0
    Я ожидаю, что только одно активное соединение в данный момент времени, поэтому я сделал это как статический синглтон. Как здесь поможет настройка номеров соединений?
  • 0
    Кроме того, можете ли вы обновить с рефакторингом, который вы упомянули?
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню