2013-07-23 3 views
6

У меня есть следующий журнал в моей Монго консоли:MongoDB вопрос открытого соединения

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. Каждый раз, когда я запустить сервер Монго это происходит. У меня только одноточечная связь в моем коде. Что может быть проблемой здесь:

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

Есть несколько методов? Можете ли вы сделать его «синхронизированным»? – bsd

+0

Мои DAO вызовут этот метод класса соединителя, чтобы получить соединение. Также это соединение является статическим одноэлементным, поэтому я ожидаю, что он будет иметь только одно соединение в данный момент времени. Итак, зачем мне синхронизироваться здесь? – popcoder

ответ

8

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

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

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

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

Вот набросок того, что я имею в виду:

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

Я ожидаю только одно активное соединение в данный момент, вот почему я сделал его как статический синглтон. Как здесь настраиваются номера соединений? – popcoder

+0

Кроме того, можете ли вы обновить рефакторинг, о котором вы упомянули? – popcoder

+0

Как вы делаете запрос? Представлено ли оно через браузер? Опишите поток в вопросе. Обновлен относительно singleton. –

Смежные вопросы