MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

problema de conexão aberta mongodb


O MongoClient possui um pool de conexões interno. O número máximo de conexões pode ser configurado (o padrão é 100). Você pode configurá-lo usando MongoClientOptions assim:
MongoClientOptions options = MongoClientOptions.builder()
                .connectionsPerHost(100)
                .autoConnectRetry(true)
                .build();

E, em seguida, dê essas opções ao MongoClient (verifiquei no Mongo Java API v2.11.1). As conexões no pool são mantidas abertas (abrir e fechar a conexão geralmente é uma operação cara) para que possam ser reutilizadas posteriormente.

Eu também refatoraria seu singleton de cliente MongoDB usando enum por exemplo, para evitar colocar synchronized neste método.

Aqui está um esboço do que quero dizer:
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();
    }
}

Então, você pode acessar seu banco de dados via
MongoDB.INSTANCE.getSomeDB().getCollection("someCollection").count();