原文鏈接: java操作mongodb(連接池)
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 MongoClient( 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);
- }