MongoClient ma wewnętrzną pulę połączeń. Można skonfigurować maksymalną liczbę połączeń (domyślnie 100). Można go ustawić za pomocą MongoClientOptions
takiego:
MongoClientOptions options = MongoClientOptions.builder()
.connectionsPerHost(100)
.autoConnectRetry(true)
.build();
A potem dać te opcje MongoClient (sprawdziliśmy to w Mongo Java API v2.11.1). Połączenia w puli są utrzymywane otwarte (otwieranie i zamykanie połączenia jest zwykle kosztowną operacją), aby można je było później ponownie wykorzystać.
Chciałbym również zmienić singleton klienta MongoDB przy użyciu enum
na przykład, aby uniknąć umieszczenia synchronized
w tej metodzie.
Oto szkic tego, co mam na myśli:
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();
}
}
Następnie można uzyskać dostęp do bazy danych poprzez
MongoDB.INSTANCE.getSomeDB().getCollection("someCollection").count();
Czy istnieje wiele metod? Czy możesz uczynić to "zsynchronizowanym"? – bsd
Moje DAO wezwie tę metodę klasy łącznika, aby uzyskać połączenie. Również to połączenie jest statyczne, więc oczekuję, że będzie miało tylko jedno połączenie w danym czasie .... Dlaczego więc potrzebuję synchronizacji tutaj? – popcoder