2013-07-23 15 views
6

私はMongoのコンソールで次のログを持っている:MongoDBのオープン接続の問題

Tue Jul 23 17:20:01.301 [initandlisten] waiting for connections on port 27017 
Tue Jul 23 17:20:01.401 [websvr] admin web console waiting for connections on port 28017 
Tue Jul 23 17:20:01.569 [initandlisten] connection accepted from 127.0.0.1:58090 #1 (1 connection now open) 
Tue Jul 23 17:20:01.570 [initandlisten] connection accepted from 127.0.0.1:58089 #2 (2 connections now open) 
Tue Jul 23 17:20:21.799 [initandlisten] connection accepted from 127.0.0.1:58113 #3 (3 connections now open) 
.... 
.... 
.... 

私はこの問題が発生したモンゴサーバを起動するたびに同様にログが上になり、今では112です。私は自分のコードでシングルトン接続しか持っていません。

public static DB getConnection(String databaseName) throws AppConnectionException { 

    if (null != db) { 
     Logger.debug("Returning existing db connection...!"); 
     return db; 
    } 

    Logger.debug("Creating new db connection...!"); 
    final String connStr = PropertyRetreiver.getPropertyFromConfigurationFile("rawdata.url"); 

    try { 

     final MongoClientURI uri = new MongoClientURI(connStr); 
     final MongoClient client = new MongoClient(uri); 
     db = client.getDB(databaseName); 

    } catch (UnknownHostException e) { 
     throw new AppConnectionException(
       "Unable to connect to the given host/port."); 
    } 

    return db; 
} 
+0

経由でデータベースにアクセスすることができ、その後

public enum MongoDB { INSTANCE; private static final String MONGO_DB_HOST = "some.mongohost.com"; private Mongo mongo; private DB someDB; MongoDB() { MongoClientOptions options = MongoClientOptions.builder() .connectionsPerHost(100) .autoConnectRetry(true) .readPreference(ReadPreference.secondaryPreferred()) .build(); try { mongo = new MongoClient(MONGO_DB_HOST, options); } catch (UnknownHostException e) { e.printStackTrace(); } someDB = mongo.getDB("someDB"); //authenticate if needed //boolean auth = someDB.authenticate("username", "password".toCharArray()); //if(!auth){ // System.out.println("Error Connecting To DB"); //} } public DB getSomeDB() { return someDB; } //call it on your shutdown hook for example public void close(){ mongo.close(); } } 

:ここ

は、私が何を意味するかのスケッチのですか?あなたはそれを同期させることができますか? – bsd

+0

私のDAOは、このコネクタクラスメソッドを呼び出して接続を取得します。また、この接続は静的なシングルトンですので、私はそれが所定の時間に1つだけの接続を持つことを期待して....だから、なぜ私はここで同期する必要がありますか? – popcoder

答えて

8

MongoClientに内部接続プールがあります。最大接続数を設定できます(デフォルトは100)。 (モンゴのJava APIのv2.11.1でそれをチェックする)

MongoClientOptions options = MongoClientOptions.builder() 
       .connectionsPerHost(100) 
       .autoConnectRetry(true) 
       .build(); 

そしてMongoClientにこれらのオプションを与える:あなたはこのよう MongoClientOptionsを使用して設定することができます。 プール内の接続は開いたままです(開閉接続は通常は高価な操作です)。後で再利用できるようにします。

enumを使用してMongoDBクライアントシングルトンをリファクタリングして、このメソッドに​​を入れないようにします。あなたは、複数の方法があり

MongoDB.INSTANCE.getSomeDB().getCollection("someCollection").count(); 
+0

私は静的なシングルトンとしてそれを作った理由は、特定の時間に1つだけアクティブな接続を期待しています。接続番号の設定はどのように役立ちますか? – popcoder

+0

また、あなたが言及したリファクタリングで更新することができますか? – popcoder

+0

あなたのリクエストはどのように発信されましたか?それはブラウザ経由で提出されますか?質問の流れを記述してください。シングルトンに関して更新されました。 –