как проверить из драйвера, работает ли сервер mongoDB - PullRequest
16 голосов
/ 26 июля 2011

Интересно, есть ли способ проверить, работает ли сервер mongoDB из драйвера java для mongoDB?

Согласно учебнику я могу сделать

Mongo m = new Mongo();
// or
Mongo m = new Mongo( "localhost" , 27017 );
// and
DB db = m.getDB( "mydb" );

Но как проверить, что я могу использовать эти Монго и БД? Я не вижу метода isConnected () в API.

db.getConnector().isOpen() 

возвращает истину

Единственный способ, который я нашел, это вызвать db.getDatabaseNames () и перехватить MongoException.

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

Ответы [ 5 ]

17 голосов
/ 30 мая 2013

Вы можете запустить команду ping

 Mongo mongo = new Mongo();
 DBObject ping = new BasicDBObject("ping", "1");
 try {
       mongo.getDB("dbname").command(ping);
 } catch (MongoException e) {
       ...
 }
12 голосов
/ 16 июля 2013

Я нашел это более прямым, чем команда ping:

Mongo mongo = new Mongo();
try {
  mongo.getConnector().getDBPortPool(mongo.getAddress()).get().ensureOpen();
} catch (Exception e) {
  ...
}
10 голосов
/ 26 июля 2011

если есть способ проверить, запущен ли сервер mongoDB из драйвера java для MongoDB?

Так что, если вы можете сделать следующее:

Mongo m = new Mongo( "localhost" , 27017 );
DB db = m.getDB( "mydb" );

Затем вы подключаетесь к базе данных, иначе m.getDB() выдаст исключение. Если вы можете подключиться к базе данных, то сервер MongoDB работает .

Единственный способ, который я нашел, это вызвать db.getDatabaseNames () и перехватить MongoException. Есть ли еще цивилизованный подход?

Что-то конкретно не так с этим подходом?

Драйвер в основном работает в песочнице, где он может или не может подключиться. Вы просите водителя узнать что-то конкретное о сервере ( запущен ли процесс X? ), но это не работа водителя. Он может либо подключаться, либо нет, он не отвечает за работу службы / процесса, только за подключение к нему.

Чтобы знать, что процесс на самом деле запущен, вам нужны административные функции на этом сервере, которые позволят вам убедиться, что mongod действительно работает с правильными параметрами.

3 голосов
/ 18 ноября 2013
public boolean keepAlive(Mongo mongo) {
    return mongo.getAddress() != null;
}

Возвращает ноль для адреса, если монго не работает.Вы можете посмотреть в реализации getAddress () , чтобы понять, почему это хороший способ проверить состояние монго.

Я предполагаю, что вы инициализировали Монго параметр правильно.

1 голос
/ 05 апреля 2012

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

...