MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

mongodb problema di connessione aperta

MongoClient dispone di un pool di connessioni interno. È possibile configurare il numero massimo di connessioni (il valore predefinito è 100). Puoi impostarlo utilizzando MongoClientOptions così:

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

E quindi dai queste opzioni a MongoClient (controllalo in Mongo Java API v2.11.1). Le connessioni nel pool vengono mantenute aperte (l'apertura e la chiusura della connessione è solitamente un'operazione costosa) in modo che possano essere riutilizzate in seguito.

Vorrei anche refactoring singleton del tuo client MongoDB usando enum ad esempio per evitare di inserire synchronized su questo metodo.

Ecco uno schizzo di cosa intendo:

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, puoi accedere al tuo database tramite

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