2011-07-26 12 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()とキャッチ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")を呼び出すことができ、例外がスローされません。 Mongoは実行されていません(例: "mongodb://127.0.0.1:12345")。私も未知のgetDatabaseNames()チェックに悩まされています。 –

1

私は(localhostのみモンゴを使用して)徹底的にこれをテストしていませんが、今のところ仕事に表示されます。

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コマンドよりも直接的であることがわかってきましたpingコマンド

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

pingコマンドは、サーバーがコマンドに応答しているかどうかをテストするために使用されます。このコマンドは、サーバーが書込みロックされていてもすぐに戻ります。 –

+0

これはOracleの「select one from dual」コマンドに最も近いものです。 –

11

を実行することができます。

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

モンゴがある場合、これはアドレスのためにnullを返しますダウン。 getAddress()の実装内を調べると、mongoの状態を確認する良い方法であることがわかります。

mongoパラメータを正しく初期化しているものとします。

+0

MongoDBがダウンしても 'null 'を返しません。有効なcom.mongodb.ServerAddressインスタンスを返すだけです。このインスタンスは、 'Mongo mongo'を初期化する際に提供するサーバアドレスとポートで初期化されます。または 'MongoClient mongo'より新しいバージョン – Nikhil

+0

' mongo.getAllAddress() 'を試してみてください。 – rupweb

関連する問題