2013-07-23 18 views
6

Ho il seguente My console mongo:MongoDB problema di connessione aperta

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) 
.... 
.... 
.... 

allo stesso modo il registro va avanti ed ora è in 112. Ogni volta che quando avvio del server mongo questo accade. Ho solo una connessione singleton nel mio codice. Quale può essere il problema qui:

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

Ci sono diversi metodi? Puoi renderlo 'sincronizzato'? – bsd

+0

I miei DAO chiameranno questo metodo di classe connettore per ottenere la connessione. Anche questa connessione è statica, quindi mi aspetto che abbia una sola connessione in un dato momento ... Quindi, perché ho bisogno di sincronizzarmi qui ??? – popcoder

risposta

8

MongoClient dispone di un pool di connessione interno. È possibile configurare il numero massimo di connessioni (l'impostazione predefinita è 100). È possibile impostare utilizzando MongoClientOptions come questo:

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

E poi dare queste opzioni per MongoClient (controllato a Mongo API Java v2.11.1). Le connessioni nel pool vengono mantenute aperte (la connessione di apertura e chiusura di solito è un'operazione costosa) in modo che possano essere successivamente riutilizzate.

Vorrei anche refactoring il client Singolo MongoDB utilizzando enum ad esempio per evitare di inserire synchronized su questo metodo.

Ecco un abbozzo di quello che voglio dire:

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(); 
    } 
} 

Quindi, è possibile accedere al database tramite

MongoDB.INSTANCE.getSomeDB().getCollection("someCollection").count(); 
+0

Mi aspetto solo una connessione attiva in un dato momento, ecco perché l'ho creato come un singleton statico. In che modo la configurazione dei numeri di connessione aiuterà qui? – popcoder

+0

Inoltre, puoi aggiornare con il refactoring che hai menzionato? – popcoder

+0

Come è nata la tua richiesta? È inviato tramite browser? Si prega di descrivere il flusso nella domanda. Aggiornato per quanto riguarda Singleton. –

Problemi correlati