2013-07-23 11 views
6

Mam następujący dziennik w moim konsoli Mongo:MongoDB problem otwarte połączenie

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

również dziennik idzie, a teraz jest w 112. Za każdym razem, kiedy zaczynam serwer Mongo tak się dzieje. Mam tylko jedno połączenie singleton w moim kodzie. Co może być problemem:

+0

Czy istnieje wiele metod? Czy możesz uczynić to "zsynchronizowanym"? – bsd

+0

Moje DAO wezwie tę metodę klasy łącznika, aby uzyskać połączenie. Również to połączenie jest statyczne, więc oczekuję, że będzie miało tylko jedno połączenie w danym czasie .... Dlaczego więc potrzebuję synchronizacji tutaj? – popcoder

Odpowiedz

8

MongoClient ma wewnętrzną pulę połączeń. Można skonfigurować maksymalną liczbę połączeń (domyślnie 100). Można go ustawić za pomocą MongoClientOptions takiego:

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

A potem dać te opcje MongoClient (sprawdziliśmy to w Mongo Java API v2.11.1). Połączenia w puli są utrzymywane otwarte (otwieranie i zamykanie połączenia jest zwykle kosztowną operacją), aby można je było później ponownie wykorzystać.

Chciałbym również zmienić singleton klienta MongoDB przy użyciu enum na przykład, aby uniknąć umieszczenia synchronized w tej metodzie.

Oto szkic tego, co mam na myśli:

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

Następnie można uzyskać dostęp do bazy danych poprzez

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

Oczekuję tylko jednego aktywnego połączenia w danym momencie, dlatego zostałem ustawiony jako statyczny singleton. W czym pomoże konfiguracja numerów połączeń? – popcoder

+0

Czy możesz również zaktualizować wspomniany refaktoryzacji? – popcoder

+0

Skąd pochodzi Twoja prośba? Czy jest przesyłana za pośrednictwem przeglądarki? Opisz przepływ w pytaniu. Zaktualizowano w odniesieniu do singleton. –

Powiązane problemy