我想知道,如果有办法检查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。
如果有更文明的方法吗?
答案 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,因此使用风险自负。