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