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

我想知道,如果有办法检查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。

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

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

所以如果你能做到以下几点:

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

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

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

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

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

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

您可以运行ping命令

  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; } 

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

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

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