1. 程式人生 > >MongoDB Java 連線池的注意事項

MongoDB Java 連線池的注意事項

1.Mongo物件

Mongo物件內部實現了一個連線池。Mongo物件是執行緒安全的,因此可以只建立一個,在多執行緒環境下安全使用。因此,我們可以用將Mongo變數作為一個Singleton類的成員變數,從而保證只建立一個連線池。Mongo.close方法將關閉當前所有活躍的連線。所以要在web工程被從Tomcat或者GlassFish容器中登出的時候確保呼叫close方法。

2.DB物件

DB物件可以通過Mongo.get方法獲得,代表了和資料庫的一個連線。預設情況下,當執行完資料庫的查詢或者更新操作後,連線將自動回到連線池中。不需要我們手動呼叫程式碼放回池中。至於如何實現,我猜測是update,query,save方法內部有finally塊,那裡面有還連線到池中的程式碼。

3.手動還連線入池

DB物件也允許在一個連線上執行多個操作,比如下面的程式碼:



DB db...;
db.requestStart();

code....

db.requestDone();

requestStart 會讓自動還連線入池失效,因此必須確保requestDone一定能夠被呼叫。這裡應該用finally塊會更嚴密一些。

4.示例程式碼,下面的類實現了Lazy loading的Singleton模式,裡面的成員變數Mongo mongo因此只會例項化一次。注意連線池大小和重連設定。

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:
[email protected]
">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; } } }


相關推薦

no