mongoDB 實(shí)現(xiàn)主從讀寫分離實(shí)現(xiàn)的實(shí)例代碼
mongoDB主從讀寫分離
MongoDB官方已經(jīng)不建議使用主從模式了,替代方案是采用副本集的模式, 點(diǎn)擊查看。如果您的環(huán)境不符合副本集模式可參考本文,來實(shí)現(xiàn)主從讀寫分離。
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ù)庫信息 -->
<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 -->
<!-- 寫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>
<!-- 寫end -->
<!-- 鏈接對象注入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>
<!-- 鏈接對象注入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配置類
*
* @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;
}
}
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- Python實(shí)現(xiàn)讀取SQLServer數(shù)據(jù)并插入到MongoDB數(shù)據(jù)庫的方法示例
- Python實(shí)現(xiàn)批量讀取圖片并存入mongodb數(shù)據(jù)庫的方法示例
- python讀取json文件并將數(shù)據(jù)插入到mongodb的方法
- 了不起的node.js讀書筆記之mongodb數(shù)據(jù)庫交互
- mongodb的寫操作
- mongodb與sql關(guān)系型數(shù)據(jù)比較
- mongodb使用c#驅(qū)動數(shù)據(jù)插入demo
- c#操作mongodb插入數(shù)據(jù)效率
- mongodb實(shí)現(xiàn)數(shù)組對象求和方法實(shí)例
- Mongodb讀數(shù)據(jù)操作
相關(guān)文章
centos7安裝mongo數(shù)據(jù)庫的方法(mongo4.2.8)
這篇文章給大家介紹了centos7安裝mongo4.2.8數(shù)據(jù)庫的詳細(xì)過程,包括mongo數(shù)據(jù)庫安裝和啟動方法,本文給大家介紹的非常詳細(xì),對大家的學(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’,今天就說說這個(gè)問題如何解決,需要的朋友可以參考下2020-02-02
MongoDB增刪查改操作示例【基于JavaScript Shell】
這篇文章主要介紹了MongoDB增刪查改操作,結(jié)合實(shí)例形式分析了MongoDB數(shù)據(jù)庫基于JavaScript Shell的基本增刪查改操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2019-07-07
MongoDB數(shù)據(jù)庫條件查詢技巧總結(jié)
查詢是數(shù)據(jù)庫的基本操作之一,下面這篇文章主要給大家介紹了關(guān)于MongoDB數(shù)據(jù)庫條件查詢技巧的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06
Mongodb 如何將時(shí)間戳轉(zhuǎn)換為年月日日期
這篇文章主要介紹了Mongodb 如何將時(shí)間戳轉(zhuǎn)換為年月日日期,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
MongoDB的$sample、aggregate和$rand實(shí)現(xiàn)隨機(jī)選取數(shù)據(jù)
在MongoDB中,我們可以使用內(nèi)置的$sample聚合操作符來隨機(jī)生成數(shù)據(jù),$sample可以從集合文檔中隨機(jī)選擇指定數(shù)量的文檔,但由于其查詢整個(gè)集合的性能問題,應(yīng)該慎用,aggregate方法以及$rand函數(shù)的結(jié)合使用可以實(shí)現(xiàn)更加靈活的查詢操作,并且可以對查詢結(jié)果進(jìn)行精細(xì)篩選2024-01-01

