Как проверить драйвер, если работает сервер mongoDB
Интересно, если есть способ проверить, запущен ли сервер mongoDB из java-драйвера для mongoDB?
Согласно учебнику, я могу сделать
Mongo m = new Mongo();
// or
Mongo m = new Mongo( "localhost" , 27017 );
// and
DB db = m.getDB( "mydb" );
Но как проверить, что я могу использовать эти Mongo и DB? Я не вижу метода isConnected() в API.
db.getConnector().isOpen()
возвращает true
Единственный способ, которым я нашел, - вызов db.getDatabaseNames() и захват MongoException.
Если есть еще более цивилизованный подход?
Ответы
Ответ 1
если есть способ проверить, запущен ли сервер mongoDB из java-драйвера для mongoDB?
Итак, если вы можете сделать следующее:
Mongo m = new Mongo( "localhost" , 27017 );
DB db = m.getDB( "mydb" );
Затем вы подключены к базе данных, иначе m.getDB()
будет выдавать исключение. Если вы можете подключиться к базе данных, то сервер MongoDB будет запущен.
Единственный способ, которым я нашел, - вызов db.getDatabaseNames() и захват MongoException. Если есть еще более цивилизованный подход?
Есть ли что-то особенное с этим подходом?
Драйвер в основном работает в песочнице, где он может или не может подключиться. Вы просите водителя узнать что-то конкретное о сервере (работает процесс X?), Но это не задание драйвера. Он может либо подключиться, либо не может, он не отвечает за работу службы/процесса, просто для подключения к ней.
Чтобы знать, что процесс действительно запущен, вам нужны административные функции на этом сервере, которые позволяют вам проверить, что mongod
действительно работает с правильными параметрами.
Ответ 2
Вы можете запустить команду ping
Mongo mongo = new Mongo();
DBObject ping = new BasicDBObject("ping", "1");
try {
mongo.getDB("dbname").command(ping);
} catch (MongoException e) {
...
}
Ответ 3
Я нашел это более прямым, чем команда ping:
Mongo mongo = new Mongo();
try {
mongo.getConnector().getDBPortPool(mongo.getAddress()).get().ensureOpen();
} catch (Exception e) {
...
}
Ответ 4
public boolean keepAlive(Mongo mongo) {
return mongo.getAddress() != null;
}
Это возвращает значение null для адреса, если mongo не работает. Вы можете посмотреть в getAddress(), чтобы узнать, почему это хороший способ проверить статус монго.
Я предполагаю, что вы правильно инициализировали параметр mongo.
Ответ 5
Я не тестировал это полностью (только с помощью localhost mongo), но он работает до сих пор:
public boolean mongoRunningAt(String uri) {
try {
Mongo mongo = new Mongo(new MongoURI(uri));
try {
Socket socket = mongo.getMongoOptions().socketFactory.createSocket();
socket.connect(mongo.getAddress().getSocketAddress());
socket.close();
} catch (IOException ex) {
return false;
}
mongo.close();
return true;
} catch (UnknownHostException e) {
return false;
}
}
И тесты, которые я использовал:
@Test
public void whenMongoNotAvailableAtSpecificURLThenTheLoaderKnows() {
assertThat(mongoRunningAt("mongodb://127.0.0.1:12345"), is(false));
}
@Test
public void whenMongoAvailableAtSpecificURLThenTheLoaderKnows() {
assertThat(mongoRunningAt("mongodb://127.0.0.1:27017"), is(true));
}
Это не совсем корректно использует общедоступный API, поэтому используйте его на свой страх и риск.