2011-07-26 71 views
16

我想知道,如果有一種方法來檢查mongoDB服務器是否從mongoDB的java驅動程序運行?如何從驅動程序檢查,如果mongoDB服務器正在運行

按照教程中,我可以做

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

但如何檢查,我可以使用這些蒙戈和DB?我在API中看不到isConnected()方法。

db.getConnector().isOpen() 

返回true

我發現的唯一方法是調用db.getDatabaseNames()和catch MongoException。

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

+0

請按照下面的解決方案:= http://stackoverflow.com/questions/17194268/mongodb-check-connection-to-db/39294943#39294943 –

回答

9

如果有方法檢查mongoDB服務器是否正在從mongoDB的java驅動程序運行?

所以,如果你能做到以下幾點:

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

然後您連接到數據庫,否則這m.getDB()會拋出異常。如果可以連接到數據庫,那麼MongoDB服務器正在運行

我發現的唯一方法是調用db.getDatabaseNames()並捕獲MongoException。 如果還有更文明的辦法?

這種方法有什麼特別的錯誤嗎?

驅動程序基本上運行在可以連接或不能連接的沙箱中。你要求驅動程序知道關於服務器的具體內容(是進程X正在運行?),但這不是驅動程序的工作。它既可以連接也可以不連接,它不負責操作服務/進程,只是爲了連接它。

要知道該過程實際上正在運行,您需要該服務器上的管理功能,以允許您檢查mongod確實運行的參數是否正確。

+0

問題是,這看起來不像是拋出檢查異常 - 這種情況是可以由調用者處理的。 – wulfgarpro

+0

如果它沒有在Java中拋出檢查異常,那實際上可能是一個錯誤。你有沒有檢查過jira.mongodb.org的門票? –

+8

也許這個問題已經過時了,因爲在我目前的mongo版本(2.7.3)中,我可以調用mongo.getDB(「anynameatall」)並且它不會拋出異常,即使當「連接」到一個URL沒有Mongo正在運行(例如「mongodb://127.0.0.1:12345」)。我也被卡在不文明的getDatabaseNames()檢查中。 –

1

我還沒有徹底測試此(僅使用本地主機蒙戈),但它似乎工作至今:

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,因此風險自負。

+1

這種方法沒有問題,如果mongos啓動但底層repset/shards不是它會報告它? –

16

您可以運行一個命令ping

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

ping命令是一個no-op,用於測試服務器是否響應命令。即使服務器被寫入鎖定,該命令也會立即返回: –

+0

這是迄今爲止最接近的與Oracle「從雙重選擇1」命令等效的等效命令。 –

11

我發現這比ping命令更直接:

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

老兄,沒有什麼,包括ping命令或任何東西都無法幫助處理java.net.ConnectException。這就像一個魅力! – tugcem

+0

看起來mongo.getAddress()在mongo關閉的情況下返回null,你真的需要這些額外的步驟嗎? – amazia

+0

@amazia否。如果您使用的是使用'MongoClient'實例的最新版本,'mongoClient.getAddress()'不*返回null。不知道早期版本。這實際上是最有效的方法。 +1 – Nikhil

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

這將返回空值地址,如果蒙戈是下。你可以看看執行getAddress(),看看爲什麼它是檢查mongo狀態的好方法。

我假設你已經正確地初始化了mongo參數。

+0

即使MongoDB關閉,這也不會返回null。它只是返回一個有效的com.mongodb.ServerAddress實例,該實例使用我們在初始化Mongo mongo時提供的服務器地址和端口進行初始化。或者'MongoClient mongo'用更新的版本 – Nikhil

+0

你可以試試'mongo.getAllAddress()' – rupweb

相關問題