MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Problem mit offener Mongodb-Verbindung

MongoClient verfügt über einen internen Verbindungspool. Es kann eine maximale Anzahl von Verbindungen konfiguriert werden (Standard ist 100). Sie können es mit MongoClientOptions festlegen so:

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

Geben Sie diese Optionen dann MongoClient (überprüft in Mongo Java API v2.11.1). Verbindungen im Pool werden offen gehalten (das Öffnen und Schließen von Verbindungen ist normalerweise ein teurer Vorgang), damit sie später wiederverwendet werden können.

Ich würde auch Ihren MongoDB-Client-Singleton mit enum umgestalten zum Beispiel um zu vermeiden, dass synchronized gesetzt wird auf dieser Methode.

Hier ist eine Skizze dessen, was ich meine:

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

Anschließend können Sie über

auf Ihre Datenbank zugreifen
MongoDB.INSTANCE.getSomeDB().getCollection("someCollection").count();