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