16

我想知道,是否有办法检查 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() 

返回真

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

如果有一些更文明的做法?

4

5 回答 5

21

您可以运行ping命令

 Mongo mongo = new Mongo();
 DBObject ping = new BasicDBObject("ping", "1");
 try {
       mongo.getDB("dbname").command(ping);
 } catch (MongoException e) {
       ...
 }
于 2013-05-29T20:33:43.770 回答
12

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

Mongo mongo = new Mongo();
try {
  mongo.getConnector().getDBPortPool(mongo.getAddress()).get().ensureOpen();
} catch (Exception e) {
  ...
}
于 2013-07-16T01:28:16.877 回答
11

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

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

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

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

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

这种方法有什么特别的问题吗?

驱动程序基本上在一个沙箱中运行,它可以或不能连接。您要求驱动程序了解有关服务器的特定信息(进程 X 是否正在运行?),但这不是驱动程序的工作。它可以连接也可以不连接,它不负责操作服务/进程,只负责连接它。

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

于 2011-07-26T19:56:20.863 回答
3
public boolean keepAlive(Mongo mongo) {
    return mongo.getAddress() != null;
}

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

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

于 2013-11-18T11:08:52.293 回答
1

我还没有彻底测试过这个(只使用本地主机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,因此使用风险自负。

于 2012-04-05T13:58:12.873 回答