sql >> Base de Datos >  >> NoSQL >> MongoDB

problema de conexión abierta mongodb

MongoClient tiene un grupo de conexiones internas. Se puede configurar el número máximo de conexiones (el valor predeterminado es 100). Puede configurarlo usando MongoClientOptions así:

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

Y luego proporcione estas opciones a MongoClient (lo verificó en Mongo Java API v2.11.1). Las conexiones en el grupo se mantienen abiertas (la apertura y el cierre de la conexión suelen ser una operación costosa) para que puedan reutilizarse más tarde.

También refactorizaría su singleton de cliente MongoDB usando enum por ejemplo para evitar poner synchronized en este método.

Aquí hay un bosquejo de lo que quiero decir:

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

Luego, puede acceder a su base de datos a través de

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