MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

problème de connexion ouverte mongodb

MongoClient a un pool de connexion interne. Le nombre maximum de connexions peut être configuré (la valeur par défaut est 100). Vous pouvez le définir en utilisant MongoClientOptions comme ceci :

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

Et donnez ensuite ces options à MongoClient (vérifié dans Mongo Java API v2.11.1). Les connexions dans le pool sont maintenues ouvertes (l'ouverture et la fermeture de la connexion sont généralement une opération coûteuse) afin qu'elles puissent être réutilisées ultérieurement.

Je refactoriserais également votre singleton client MongoDB en utilisant enum par exemple pour éviter de mettre synchronized sur cette méthode.

Voici un croquis de ce que je veux 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();
    }
}

Ensuite, vous pouvez accéder à votre base de données via

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