mongodb接続プール

6117 ワード

一.mongodbの接続プール
ちょうど手に入れたMongoDB、応用をする時、以前使用した関係型データベースの影響を受けて、データベースの接続プールの問題を考慮することができます!
リレーショナル・データベースでは、接続プールとしてN個の接続(connection)を事前に確立し、接続プール(connection pool)を構築し、接続の削除や返却などの操作を行うことにほかならない.
MongoDBでは、まずinsertを例に、どのように操作するかを見てみましょう.Mongo m = new   Mongo( "localhost"   , 27017   ); DB db = m.getDB( "mydb"   ); //get collection DBCollection coll = db.getCollection( "testCollection" ) //insert BasicDBObject doc = new   BasicDBObject(); ... coll.insert(doc); [ ]
以前の経験を当てはめると、偏った考えになるかもしれませんが、公式文書の一言を引用するとおおらかになるかもしれません.
Note: The Mongo object instance actually represents a pool of connections to the database; you will only need one object of class Mongo even with multiple threads.  See the concurrency doc page for more information.
The Mongo class is designed to be thread safe and shared among threads. Typically you create only 1 instance for a given DB cluster and use it across your app. If for some reason you decide to create many mongo intances, note that:
all resource usage limits (max connections, etc) apply per mongo instance
to dispose of an instance, make sure you call mongo.close() to clean up resources
mongoインスタンスはすでに既存の接続プールであり、スレッドは安全です.この内蔵の接続プールはデフォルトで10個の接続が初期化されており、各操作(削除・変更など)に1つの接続が取得され、操作を実行した後に接続が解放されます.
 
二.接続プールの重要なパラメータ
内蔵接続プールには、次のような複数の重要なパラメータがあります.
connectionsPerHost:ホストあたりの接続数threadsAllowedToBlockForConnectionMultiplier:スレッドキューの数です.上のconnectionsPerHost値に乗算した結果、スレッドキューの最大値になります.接続スレッドがキューにいっぱい並んでいると、「Out of semaphores to get db」エラーが投げ出されます.
maxWaitTime:最大接続待ちスレッドブロック時間接続タイムアウト:接続タイムアウトのミリ秒.0はデフォルトおよび無限です.
socketTimeout:socketタイムアウト.0はデフォルトおよび無限です.
AutoConnectRetry:この制御が1つの接続時にシステムが自動的に再試行するかどうか次のように設定されます.MongoOptions opt = mongo.getMongoOptions(); opt.connectionsPerHost = 10   ; //poolsize opt.threadsAllowedToBlockForConnectionMultiplier = 10 ; //
三.接続プールの実践package   com.bts.dao.mongodb;
  import   java.net.UnknownHostException;
  import   com.bts.util.ConfTool; import   com.mongodb.DB; import   com.mongodb.Mongo; import   com.mongodb.MongoException; import   com.mongodb.MongoOptions;
  /**   * @author huangfox   * @data 2012-4-1   * @email [email protected]   * @desc   */ public   class   MongoManager {      private   static   Mongo mongo = null ;
       private   MongoManager() {
       }
       /**       * DB,       *       * @param dbName       * @return       */      public   static   DB getDB(String dbName) {          if   (mongo == null ) {              //              init();          }          return   mongo.getDB(dbName);      }
       /**       * , 。       */      private   static   void   init() {          String confFilePath = "" ;          ConfTool conf = new   ConfTool(confFilePath);          String host = conf.getValue( "host" ); //          int   port = new   Integer(conf.getValue( "port" )); //          int   poolSize = new   Integer(conf.getValue( "poolSize" )); //          int   blockSize = new   Integer(conf.getValue( "blockSize" )); //          //          try   {              mongo = new   Mongo(host, port);              MongoOptions opt = mongo.getMongoOptions();              opt.connectionsPerHost = poolSize;              opt.threadsAllowedToBlockForConnectionMultiplier = blockSize;          } catch   (UnknownHostException e) {              // log error          } catch   (MongoException e) {              // log error          }      } }