Подтвердить что ты не робот

Как проверить драйвер, если работает сервер 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.

Если есть еще более цивилизованный подход?

4b9b3361

Ответ 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, поэтому используйте его на свой страх и риск.