mongoDB连接池

一.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个连接,每一个操作(增删改查等)都会获取一个连接,执行操作后释放连接。

 

二.连接池的重要参数

内置连接池有多个重要参数,分别是:

  • connectionsPerHost:每个主机的连接数
  • threadsAllowedToBlockForConnectionMultiplier:线程队列数,它以上面connectionsPerHost值相乘的结果就是线程队列最大值。如果连接线程排满了队列就会抛出“Out of semaphores to get db”错误。
  • maxWaitTime:最大等待连接的线程阻塞时间
  • connectTimeout:连接超时的毫秒。0是默认和无限
  • socketTimeout:socket超时。0是默认和无限
  • autoConnectRetry:这个控制是否在一个连接时,系统会自动重试

其设置方式如下:

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 huangfox009@126.com
  * @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
         }
     }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值