java操作mongodb(連線池)
阿新 • • 發佈:2018-12-24
Mongo的例項其實就是一個數據庫連線池,這個連線池裡預設有10個連結。我們沒有必要重新實現這個連結池,但是我們可以更改這個連線池的配置。因為Mongo的例項就是一個連線池,所以,專案中最好只存在一個Mongo的例項。
常見的配置引數:
connectionsPerHost:每個主機的連線數
threadsAllowedToBlockForConnectionMultiplier:執行緒佇列數,它以上面connectionsPerHost值相乘的結果就是執行緒佇列最大值。如果連線執行緒排滿了佇列就會丟擲“Out of semaphores to get db”錯誤。
maxWaitTime:最大等待連線的執行緒阻塞時間
connectTimeout:連線超時的毫秒。0是預設和無限
socketTimeout:socket超時。0是預設和無限
autoConnectRetry:這個控制是否在一個連線時,系統會自動重試
還有許多配置,可以參見mongodb的API。
下面看程式碼:
package com.mongo.common; import java.net.UnknownHostException; import com.mongodb.DB; import com.mongodb.Mongo; import com.mongodb.MongoException; import com.mongodb.MongoOptions; public class MongoManager { private final static String HOST = "localhost";// 埠 private final static int PORT = 27017;// 埠 private final static int POOLSIZE = 100;// 連線數量 private final static int BLOCKSIZE = 100; // 等待佇列長度 private static Mongo mongo = null; private MongoManager() { } static { initDBPrompties(); } public static DB getDB(String dbName) { return mongo.getDB(dbName); } /** * 初始化連線池 */ private static void initDBPrompties() { // 其他引數根據實際情況進行新增 try { mongo = new Mongo(HOST, PORT); MongoOptions opt = mongo.getMongoOptions(); opt.connectionsPerHost = POOLSIZE; opt.threadsAllowedToBlockForConnectionMultiplier = BLOCKSIZE; } catch (UnknownHostException e) { } catch (MongoException e) { } } }
使用的時候,如下所示:
/** * 儲存 * * @param user * @throws UnknownHostException */ public void save(User user) throws UnknownHostException { DB myMongo = MongoManager.getDB("myMongo"); DBCollection userCollection = myMongo.getCollection("user"); DBObject dbo = (DBObject) JSON.parse(user.toJson()); userCollection.insert(dbo); }