关系型数据库中,我们做连接池无非就是事先建立好N个连接(connection),并构建成一个连接池(connection pool),提供去连接和归还连接等操作。


Mongo m = new Mongo( "localhost" , 27017 );
DB db = m.getDB( "mydb" );
//get collection
DBCollection coll = db.getCollection("testCollection")
BasicDBObject doc = new BasicDBObject();


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





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

详情参考mongoDB API:

Field Summary
 boolean autoConnectRetry 
          If true, the driver will keep trying to connect to the same server in case that the socket cannot be established.
 int connectionsPerHost 
          The maximum number of connections allowed per host for this Mongo instance.
 int connectTimeout 
          The connection timeout in milliseconds.
 DBDecoderFactory dbDecoderFactory 
          Override the DBCallback factory.
 DBEncoderFactory dbEncoderFactory 
          Override the encoding factory.
 String description 
          The description for Mongo instances created with these options.
 boolean fsync 
          The "fsync" value of the global WriteConcern.
 boolean j 
          The "j" value of the global WriteConcern.
 long maxAutoConnectRetryTime 
          The maximum amount of time in MS to spend retrying to open connection to the same server.
 int maxWaitTime 
          The maximum wait time in ms that a thread may wait for a connection to become available.
 boolean safe 
          If true the driver will use a WriteConcern of WriteConcern.SAFE for all operations.
 boolean slaveOk 
          Deprecated. Replaced in MongoDB 2.0/Java Driver 2.7 with ReadPreference.SECONDARY
 SocketFactory socketFactory 
          sets the socket factory for creating sockets to mongod Default is SocketFactory.getDefault()
 boolean socketKeepAlive 
          This flag controls the socket keep alive feature that keeps a connection alive through firewalls Socket.setKeepAlive(boolean) Default is false.
 int socketTimeout 
          The socket timeout in milliseconds It is used for I/O socket read and write operations Socket.setSoTimeout(int) Default is 0 and means no timeout.
 int threadsAllowedToBlockForConnectionMultiplier 
          this multiplier, multiplied with the connectionsPerHost setting, gives the maximum number of threads that may be waiting for a connection to become available from the pool.
 int w 
          The "w" value of the global WriteConcern.
 int wtimeout 
          The "wtimeout" value of the global WriteConcern.



package com.bts.dao.mongodb;
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
 * @desc
public class MongoManager {
    private static Mongo mongo = null;
    private MongoManager() {
     * 根据名称获取DB,相当于是连接
     * @param dbName
     * @return
    public static DB getDB(String dbName) {
        if (mongo == null) {
            // 初始化
        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