1.Mongo對象
內部實現了一個串連池。Mongo對象是安全執行緒的,因此可以只建立一個,在多線程環境下安全使用。因此,我們可以用將Mongo變數作為一個Singleton類的成員變數,從而保證只建立一個串連池。Mongo.close方法將關閉當前所有活躍的串連。所以要在web工程被從Tomcat或者GlassFish容器中登出的時候確保調用close方法。
2.DB對象
DB對象可以通過Mongo.get方法獲得,代表了和資料庫的一個串連。預設情況下,當執行完資料庫的查詢或者更新操作後,串連將自動回到串連池中。不需要我們手動調用代碼放回池中。至於如何?,我猜測是update,query,save方法內部有finally塊,那裡面有還串連到池中的代碼。
3.手動還串連入池
DB對象也允許在一個串連上執行多個操作,比如下面的代碼:
[java]
- DB db...;
- db.requestStart();
-
- code....
-
- db.requestDone();
requestStart 會讓自動還串連入池失效,因此必須確保requestDone一定能夠被調用。這裡應該用finally塊會更嚴密一些。
4.範例程式碼,下面的類實現了Lazy loading的Singleton模式,裡面的成員變數Mongo mongo因此只會執行個體化一次。注意串連池大小和重連設定。
[java]
- package com.freebird.helper;
-
- import com.mongodb.Mongo;
- import com.mongodb.MongoOptions;
- import com.mongodb.DB;
-
- /**
- * Describe class DBManager here.
- * example:
- * 初始化:DBManager.getInstance().init("74.208.78.5",27017,200);
- * 之後,每次通過下面的代碼擷取資料庫物件
- * DBManager.getInstance().getDB();
- * Created: Sat Dec 17 10:45:24 2011
- *
- * @author <a href="mailto:chenshu@chunshu">chenshu</a>
- * @version 1.0
- */
- public class DBManager {
-
- public static final String DB_NAME = "kaimei";
-
- public static final String MESSAGE_COLLECTION = "email";
-
- public static DBManager getInstance(){
- return InnerHolder.INSTANCE;
- }
-
- /**
- * Creates a new <code>DBManager</code> instance.
- *
- */
- private DBManager() {
-
- }
-
- private static class InnerHolder{
- static final DBManager INSTANCE = new DBManager();
- }
-
- public DB getDB(){
- return mongo.getDB(DB_NAME);
- }
-
- private Mongo mongo;
-
-
- public void init(final String ip, int port, int poolSize) throws java.net.UnknownHostException {
- System.setProperty("MONGO.POOLSIZE", String.valueOf(poolSize));
- if (mongo == null) {
- mongo = new Mongo(ip, port);
- MongoOptions options = mongo.getMongoOptions();
- options.autoConnectRetry = true;
- options.connectionsPerHost = poolSize;
- }
- }
- }