У меня есть следующий журнал в моей консоли mongo:
Tue Jul 23 17:20:01.301 [initandlisten] waiting for connections on port 27017
Tue Jul 23 17:20:01.401 [websvr] admin web console waiting for connections on port 28017
Tue Jul 23 17:20:01.569 [initandlisten] connection accepted from 127.0.0.1:58090 #1 (1 connection now open)
Tue Jul 23 17:20:01.570 [initandlisten] connection accepted from 127.0.0.1:58089 #2 (2 connections now open)
Tue Jul 23 17:20:21.799 [initandlisten] connection accepted from 127.0.0.1:58113 #3 (3 connections now open)
....
....
....
Аналогично журнал продолжается, и теперь он находится в 112. Каждый раз, когда я запускаю сервер mongo, это происходит. У меня только одноточечная связь в моем коде. Что может быть здесь:
public static DB getConnection(String databaseName) throws AppConnectionException {
if (null != db) {
Logger.debug("Returning existing db connection...!");
return db;
}
Logger.debug("Creating new db connection...!");
final String connStr = PropertyRetreiver.getPropertyFromConfigurationFile("rawdata.url");
try {
final MongoClientURI uri = new MongoClientURI(connStr);
final MongoClient client = new MongoClient(uri);
db = client.getDB(databaseName);
} catch (UnknownHostException e) {
throw new AppConnectionException(
"Unable to connect to the given host / port.");
}
return db;
}
У MongoClient есть внутренний пул подключений. Можно настроить максимальное количество подключений (по умолчанию - 100). Вы можете установить его, используя MongoClientOptions
следующим образом:
MongoClientOptions options = MongoClientOptions.builder()
.connectionsPerHost(100)
.autoConnectRetry(true)
.build();
И затем дайте эти параметры MongoClient (отметьте его в Mongo Java API v2.11.1). Соединения в пуле поддерживаются открытыми (открытие и закрытие соединения обычно являются дорогостоящей операцией), чтобы впоследствии их можно было повторно использовать.
Я бы также реорганизовал ваш singleton-клиент MongoDB с помощью enum
, например, чтобы не помещать synchronized
в этот метод.
Вот эскиз того, что я имею в виду:
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();
}
}
Затем вы можете получить доступ к своей базе данных через
MongoDB.INSTANCE.getSomeDB().getCollection("someCollection").count();
synchronized
?