原文鏈接:?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);??
- ????}??
?