mongoDB 實(shí)現(xiàn)主從讀寫(xiě)分離實(shí)現(xiàn)的實(shí)例代碼
mongoDB主從讀寫(xiě)分離
MongoDB官方已經(jīng)不建議使用主從模式了,替代方案是采用副本集的模式, 點(diǎn)擊查看。如果您的環(huán)境不符合副本集模式可參考本文,來(lái)實(shí)現(xiàn)主從讀寫(xiě)分離。
resources.properties
mongodb_read.host=10.0.0.45 mongodb_read.port=27017 mongodb_read.apname=ecsp mongodb_read.username= mongodb_read.password= mongodb_write.host=10.0.0.46 mongodb_write.port=27017 mongodb_write.apname=ecsp mongodb_write.username= mongodb_write.password=
mongo_config.xml
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mongo="http://www.springframework.org/schema/data/mongo" xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.0.xsd http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <!-- 連接數(shù)據(jù)庫(kù)信息 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:resources.properties</value> </list> </property> </bean> <!-- 讀start --> <bean id="mongoServerReadAddress" class="com.mongodb.ServerAddress"> <constructor-arg value="${mongodb_read.host}"></constructor-arg> <constructor-arg value="${mongodb_read.port}"></constructor-arg> </bean> <bean id="chexunMongoReadOptions" class="com.ecsp.chexun.mongo.ChexunMongoOptions"> <property name="username" value="${mongodb_read.username}" /> <property name="password" value="${mongodb_read.password}" /> <property name="dbname" value="${mongodb_read.apname}" /> <property name="connectionsPerHost" value="100" /> <property name="threadsAllowedToBlockForConnectionMultiplier" value="5" /> <property name="slaveOk" value="true" /> </bean> <bean id="mongo_read" class="com.mongodb.Mongo"> <constructor-arg ref="mongoServerReadAddress"></constructor-arg> <constructor-arg ref="chexunMongoReadOptions"></constructor-arg> </bean> <!-- 讀end --> <!-- 寫(xiě)start --> <bean id="mongoServerWriteAddress" class="com.mongodb.ServerAddress"> <constructor-arg value="${mongodb_write.host}"></constructor-arg> <constructor-arg value="${mongodb_write.port}"></constructor-arg> </bean> <bean id="chexunMongoWriteOptions" class="com.ecsp.chexun.mongo.ChexunMongoOptions"> <property name="username" value="${mongodb_write.username}" /> <property name="password" value="${mongodb_write.password}" /> <property name="dbname" value="${mongodb_write.apname}" /> <property name="connectionsPerHost" value="100" /> <property name="threadsAllowedToBlockForConnectionMultiplier" value="5" /> </bean> <bean id="mongo_write" class="com.mongodb.Mongo"> <constructor-arg ref="mongoServerWriteAddress"></constructor-arg> <constructor-arg ref="chexunMongoWriteOptions"></constructor-arg> </bean> <!-- 寫(xiě)end --> <!-- 鏈接對(duì)象注入start --> <bean id="mongoHelper" class="com.ecsp.chexun.mongo.MongoHelper"> <constructor-arg ref="mongo_read"></constructor-arg> <constructor-arg ref="mongo_write"></constructor-arg> </bean> <!-- 鏈接對(duì)象注入end --> </beans>
web.xml
<context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/classes/mongo_config.xml </param-value> </context-param>
實(shí)體層ChexunMongoOptions.Java
package com.ecsp.chexun.mongo; import javax.net.SocketFactory; import com.mongodb.DBDecoderFactory; import com.mongodb.MongoOptions; /** * Mongo配置類(lèi) * * @author vincent.he * @version 1.0, Created on 2012-3-12 * */ public class ChexunMongoOptions extends MongoOptions{ private String username; private String password; private String dbname; public ChexunMongoOptions(){ super(); } public void setDescription(String description) { this.description = description; } public void setConnectionsPerHost(int connectionsPerHost) { this.connectionsPerHost = connectionsPerHost; } public void setThreadsAllowedToBlockForConnectionMultiplier( int threadsAllowedToBlockForConnectionMultiplier) { this.threadsAllowedToBlockForConnectionMultiplier = threadsAllowedToBlockForConnectionMultiplier; } public void setMaxWaitTime(int maxWaitTime) { this.maxWaitTime = maxWaitTime; } public void setConnectTimeout(int connectTimeout) { this.connectTimeout = connectTimeout; } public void setSocketTimeout(int socketTimeout) { this.socketTimeout = socketTimeout; } public void setSocketKeepAlive(boolean socketKeepAlive) { this.socketKeepAlive = socketKeepAlive; } public void setAutoConnectRetry(boolean autoConnectRetry) { this.autoConnectRetry = autoConnectRetry; } public void setMaxAutoConnectRetryTime(long maxAutoConnectRetryTime) { this.maxAutoConnectRetryTime = maxAutoConnectRetryTime; } public void setSlaveOk(boolean slaveOk) { this.slaveOk = slaveOk; } public void setDbDecoderFactory(DBDecoderFactory dbDecoderFactory) { this.dbDecoderFactory = dbDecoderFactory; } public void setSafe(boolean safe) { this.safe = safe; } public void setW(int w) { this.w = w; } public void setWtimeout(int wtimeout) { this.wtimeout = wtimeout; } public void setFsync(boolean fsync) { this.fsync = fsync; } public void setJ(boolean j) { this.j = j; } public void setSocketFactory(SocketFactory socketFactory) { this.socketFactory = socketFactory; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getDbname() { return dbname; } public void setDbname(String dbname) { this.dbname = dbname; } }
Java dao層
package com.ecsp.chexun.mongo; import java.util.List; import com.mongodb.BasicDBObject; import com.mongodb.CommandResult; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBObject; import com.mongodb.Mongo; /** * mongo 操做方法 * @author zhanglibing * */ public class MongoHelper { private Mongo mongo; private Mongo mongo_read; private Mongo mongo_write; private String dataBaseName = "cxec"; public MongoHelper(){} public MongoHelper(Mongo mongo,Mongo mongo_read,Mongo mongo_write){ this.mongo = mongo; this.mongo_read = mongo_read; this.mongo_write = mongo_write; } // public MongoHelper(String dbName){ // dataBaseName = dbName; // } public int add(String collectionName,BasicDBObject dbObject){ // DB db = MongoManager.getDB(dataBaseName); DB db = mongo_write.getDB(dataBaseName); DBCollection dbc = db.getCollection(collectionName); return dbc.save(dbObject).getN(); } //批量添加 public int addAll( String collectionName,List<DBObject> list){ // DB db = MongoManager.getDB(dataBaseName); DB db = mongo_write.getDB(dataBaseName); DBCollection dbc = db.getCollection(collectionName); return dbc.insert(list).getN(); } public int isExists(String collectionName,BasicDBObject query){ // DB db = MongoManager.getDB(dataBaseName); DB db = mongo_read.getDB(dataBaseName); DBCollection dbc = db.getCollection(collectionName); return dbc.find(query).size(); } public List<DBObject> get(String collectionName,BasicDBObject query){ // DB db = MongoManager.getDB(dataBaseName); DB db = mongo_read.getDB(dataBaseName); DBCollection dbc = db.getCollection(collectionName); return dbc.find(query).toArray(); } public int getCount(String collectionName,BasicDBObject query){ // DB db = MongoManager.getDB(dataBaseName); DB db = mongo_read.getDB(dataBaseName); DBCollection dbc = db.getCollection(collectionName); return dbc.find(query).count(); } public List<DBObject> get(String collectionName,BasicDBObject query,BasicDBObject keys){ // DB db = MongoManager.getDB(dataBaseName); DB db = mongo_read.getDB(dataBaseName); DBCollection dbc = db.getCollection(collectionName); return dbc.find(query, keys).toArray(); } /*** * 獲取mongo 中 collection 的值 * @param collectionName * @param query 查詢條件 * @param keys 查詢字段 * @param batchSize 返回個(gè)數(shù) * @return */ public List<DBObject> get(String collectionName,BasicDBObject query,BasicDBObject keys,BasicDBObject orderBy,int batchSize){ // DB db = MongoManager.getDB(dataBaseName); DB db = mongo_read.getDB(dataBaseName); DBCollection dbc = db.getCollection(collectionName); if(orderBy != null){ return dbc.find(query, keys).sort(orderBy).limit(batchSize).toArray(); } return dbc.find(query, keys).limit(batchSize).toArray(); } public List<DBObject> get(String collectionName,BasicDBObject query,BasicDBObject keys,BasicDBObject orderBy,int batchSize,int n){ // DB db = MongoManager.getDB(dataBaseName); DB db = mongo_read.getDB(dataBaseName); DBCollection dbc = db.getCollection(collectionName); if(orderBy != null){ return dbc.find(query, keys).sort(orderBy).limit(batchSize).skip(n).toArray(); } return dbc.find(query, keys).limit(batchSize).toArray(); } public List<DBObject> get(String collectionName,DBObject query,int batchSize){ // DB db = MongoManager.getDB(dataBaseName); DB db = mongo_read.getDB(dataBaseName); DBCollection dbc = db.getCollection(collectionName); return dbc.find(query).limit(batchSize).toArray(); } public List<DBObject> get(String collectionName,int number){ DB db = mongo_read.getDB(dataBaseName); DBCollection dbc = db.getCollection(collectionName); List<DBObject> dboList = dbc.find().skip(0).limit(number).toArray(); return dboList; } public List<DBObject> get(String collectionName,BasicDBObject query,BasicDBObject orderBy,int n,int pageSize ){ DB db = mongo_read.getDB(dataBaseName); DBCollection dbc = db.getCollection(collectionName); List<DBObject> dboList = dbc.find(query).sort(orderBy).skip(n).limit(pageSize).toArray(); return dboList; } public List<DBObject> get(String collectionName,BasicDBObject query,int top ){ DB db = mongo_read.getDB(dataBaseName); DBCollection dbc = db.getCollection(collectionName); List<DBObject> dboList = dbc.find(query).skip(0).limit(top).toArray(); return dboList; } public List<DBObject> get(String collectionName,DBObject query,DBObject orderBy,int batchSize){ // DB db = MongoManager.getDB(dataBaseName); DB db = mongo_read.getDB(dataBaseName); DBCollection dbc = db.getCollection(collectionName); return dbc.find(query).sort(orderBy).limit(batchSize).toArray(); } public int reomve(String collectionName,BasicDBObject o){ // DB db = MongoManager.getDB(dataBaseName); DB db = mongo_write.getDB(dataBaseName); DBCollection dbc = db.getCollection(collectionName); return dbc.remove(o).getN(); } public int edit(String collectionName,BasicDBObject query,BasicDBObject update){ // DB db = MongoManager.getDB(dataBaseName); DB db = mongo_write.getDB(dataBaseName); DBCollection dbc = db.getCollection(collectionName); return dbc.update(query, update).getN(); //return dbc.updateMulti(query, update).getN(); } public int edit(String cmd){ // DB db = MongoManager.getDB(dataBaseName); DB db = mongo.getDB(dataBaseName); CommandResult cmdResult = db.command(cmd); if(cmdResult.ok()) { return 1; } return 0; } // public DBCollection get(String collectionName){ //// DB db = MongoManager.getDB(dataBaseName); // DB db = mongo.getDB(dataBaseName); // return db.getCollection(collectionName); // } public void setMongo(Mongo mongo) { this.mongo = mongo; } public void setMongo_read(Mongo mongo_read) { this.mongo_read = mongo_read; } public void setMongo_write(Mongo mongo_write) { this.mongo_write = mongo_write; } }
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- Python實(shí)現(xiàn)讀取SQLServer數(shù)據(jù)并插入到MongoDB數(shù)據(jù)庫(kù)的方法示例
- Python實(shí)現(xiàn)批量讀取圖片并存入mongodb數(shù)據(jù)庫(kù)的方法示例
- python讀取json文件并將數(shù)據(jù)插入到mongodb的方法
- 了不起的node.js讀書(shū)筆記之mongodb數(shù)據(jù)庫(kù)交互
- mongodb的寫(xiě)操作
- mongodb與sql關(guān)系型數(shù)據(jù)比較
- mongodb使用c#驅(qū)動(dòng)數(shù)據(jù)插入demo
- c#操作mongodb插入數(shù)據(jù)效率
- mongodb實(shí)現(xiàn)數(shù)組對(duì)象求和方法實(shí)例
- Mongodb讀數(shù)據(jù)操作
相關(guān)文章
centos7安裝mongo數(shù)據(jù)庫(kù)的方法(mongo4.2.8)
這篇文章給大家介紹了centos7安裝mongo4.2.8數(shù)據(jù)庫(kù)的詳細(xì)過(guò)程,包括mongo數(shù)據(jù)庫(kù)安裝和啟動(dòng)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2022-01-01修復(fù) Mac brew 安裝 mongodb 報(bào) Error: No available formula with th
最近在同事新的 Mac 電腦上安裝 mongodb,報(bào)了錯(cuò)誤 Error: No available formula with the name ‘mongodb’,今天就說(shuō)說(shuō)這個(gè)問(wèn)題如何解決,需要的朋友可以參考下2020-02-02使用mongodb實(shí)現(xiàn)簡(jiǎn)單的讀寫(xiě)操作
這篇文章主要給大家介紹了如何使用mongodb實(shí)現(xiàn)簡(jiǎn)單的讀寫(xiě)操作,本文適合初學(xué)者,特別是剛剛安裝了mongodb數(shù)據(jù)庫(kù)的朋友,或在atlas剛拿到免費(fèi)集群的朋友,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2023-12-12MongoDB增刪查改操作示例【基于JavaScript Shell】
這篇文章主要介紹了MongoDB增刪查改操作,結(jié)合實(shí)例形式分析了MongoDB數(shù)據(jù)庫(kù)基于JavaScript Shell的基本增刪查改操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2019-07-07MongoDB數(shù)據(jù)庫(kù)條件查詢技巧總結(jié)
查詢是數(shù)據(jù)庫(kù)的基本操作之一,下面這篇文章主要給大家介紹了關(guān)于MongoDB數(shù)據(jù)庫(kù)條件查詢技巧的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06Mongodb 如何將時(shí)間戳轉(zhuǎn)換為年月日日期
這篇文章主要介紹了Mongodb 如何將時(shí)間戳轉(zhuǎn)換為年月日日期,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10MongoDB的$sample、aggregate和$rand實(shí)現(xiàn)隨機(jī)選取數(shù)據(jù)
在MongoDB中,我們可以使用內(nèi)置的$sample聚合操作符來(lái)隨機(jī)生成數(shù)據(jù),$sample可以從集合文檔中隨機(jī)選擇指定數(shù)量的文檔,但由于其查詢整個(gè)集合的性能問(wèn)題,應(yīng)該慎用,aggregate方法以及$rand函數(shù)的結(jié)合使用可以實(shí)現(xiàn)更加靈活的查詢操作,并且可以對(duì)查詢結(jié)果進(jìn)行精細(xì)篩選2024-01-01