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

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

5 ответов


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

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

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

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

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

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

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

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


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

 Mongo mongo = new Mongo();
 DBObject ping = new BasicDBObject("ping", "1");
 try {
       mongo.getDB("dbname").command(ping);
 } catch (MongoException e) {
       ...
 }

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

Mongo mongo = new Mongo();
try {
  mongo.getConnector().getDBPortPool(mongo.getAddress()).get().ensureOpen();
} catch (Exception e) {
  ...
}

public boolean keepAlive(Mongo mongo) {
    return mongo.getAddress() != null;
}

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

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


Я не тестировал это тщательно (ТОЛЬКО используя 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, поэтому используйте на свой страх и риск.