如何从驱动程序检查mongoDB服务器是否正在运行

时间:2011-07-26 15:26:01

标签: java mongodb mongo-java

我想知道,如果有办法检查mongoDB服务器是否从mongoDB的java驱动程序运行?

根据教程,我可以做到

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

但是如何检查我可以使用这些Mongo和DB?我在API中看不到isConnected()方法。

db.getConnector().isOpen() 

返回true

我找到的唯一方法是调用db.getDatabaseNames()并捕获MongoException。

如果有更文明的方法吗?

5 个答案:

答案 0 :(得分:17)

您可以运行ping命令

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

答案 1 :(得分:11)

我发现这比ping命令更直接:

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

答案 2 :(得分:10)

  

如果有办法检查mongoDB服务器是否从MongoDB的java驱动程序运行?

因此,如果您可以执行以下操作:

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

然后你连接到数据库,否则m.getDB()将抛出异常。如果可以连接到数据库,那么 MongoDB服务器正在运行

  

我找到的唯一方法是调用db.getDatabaseNames()并捕获MongoException。   如果有一些更文明的方法?

这种方法有什么特别的错误吗?

驱动程序基本上在沙箱中运行,它可以连接或不连接。您要求驱动程序知道有关服务器的具体信息(是进程X正在运行吗?),但这不是驱动程序的工作。它可以连接也可以不连接,它不负责操作服务/进程,只是为了连接它。

要知道该进程实际上正在运行,您需要在该服务器上使用管理功能,以便检查mongod是否确实以正确的参数运行。

答案 3 :(得分:3)

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

如果mongo关闭,这将为地址返回null。您可以查看 getAddress() 的实现,看看为什么它是检查mongo状态的好方法。

我假设您已正确初始化 mongo 参数。

答案 4 :(得分:1)

我没有彻底测试过这个问题(仅使用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,因此使用风险自负。