MongoDB Java 连接池的注意事项


1.Mongo对象

内部实现了一个连接池。Mongo对象是线程安全的,因此可以只创建一个,在多线程环境下安全使用。因此,我们可以用将Mongo变量作为一个Singleton类的成员变量,从而保证只创建一个连接池。Mongo.close方法将关闭当前所有活跃的连接。所以要在web工程被从Tomcat或者GlassFish容器中注销的时候确保调用close方法。

2.DB对象

DB对象可以通过Mongo.get方法获得,代表了和数据库的一个连接。默认情况下,当执行完数据库的查询或者更新操作后,连接将自动回到连接池中。不需要我们手动调用代码放回池中。至于如何实现,我猜测是update,query,save方法内部有finally块,那里面有还连接到池中的代码。

3.手动还连接入池

DB对象也允许在一个连接上执行多个操作,比如下面的代码:

[java]

  1. DB db...;  
  2. db.requestStart();  
  3.   
  4. code....  
  5.   
  6. db.requestDone();  
requestStart 会让自动还连接入池失效,因此必须确保requestDone一定能够被调用。这里应该用finally块会更严密一些。

4.示例代码,下面的类实现了Lazy loading的Singleton模式,里面的成员变量Mongo mongo因此只会实例化一次。注意连接池大小和重连设置。

[java]

  1. package com.freebird.helper;  
  2.   
  3. import com.mongodb.Mongo;  
  4. import com.mongodb.MongoOptions;  
  5. import com.mongodb.DB;  
  6.   
  7. /** 
  8.  * Describe class DBManager here. 
  9.  * example: 
  10.  * 初始化:DBManager.getInstance().init("74.208.78.5",27017,200); 
  11.  * 之后,每次通过下面的代码获取数据库对象 
  12.  * DBManager.getInstance().getDB(); 
  13.  * Created: Sat Dec 17 10:45:24 2011 
  14.  * 
  15.  * @author <a href="mailto:chenshu@chunshu">chenshu</a> 
  16.  * @version 1.0 
  17.  */  
  18. public class DBManager {  
  19.   
  20.     public static final String DB_NAME = "kaimei";  
  21.       
  22.     public static final String MESSAGE_COLLECTION = "email";  
  23.   
  24.     public static DBManager getInstance(){  
  25.     return InnerHolder.INSTANCE;  
  26.     }  
  27.   
  28.     /** 
  29.      * Creates a new <code>DBManager</code> instance. 
  30.      * 
  31.      */  
  32.     private DBManager() {  
  33.       
  34.     }  
  35.   
  36.     private static class InnerHolder{  
  37.     static final DBManager INSTANCE = new DBManager();  
  38.     }  
  39.   
  40.     public DB getDB(){  
  41.     return mongo.getDB(DB_NAME);  
  42.     }  
  43.   
  44.     private Mongo mongo;  
  45.       
  46.   
  47.     public void init(final String ip, int port, int poolSize) throws java.net.UnknownHostException {  
  48.         System.setProperty("MONGO.POOLSIZE", String.valueOf(poolSize));  
  49.         if (mongo == null) {  
  50.             mongo = new Mongo(ip, port);  
  51.             MongoOptions options = mongo.getMongoOptions();  
  52.             options.autoConnectRetry = true;  
  53.             options.connectionsPerHost = poolSize;  
  54.         }  
  55.     }  
  56. }  

相关内容