mongoDB 实现主从读写分离实现的实例代码

发布时间 - 2026-01-10 22:36:43    点击率:

mongoDB主从读写分离

MongoDB官方已经不建议使用主从模式了,替代方案是采用副本集的模式, 点击查看。如果您的环境不符合副本集模式可参考本文,来实现主从读写分离。

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">

  <!-- 连接数据库信息 -->
  <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>

实体层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 返回个数
   * @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;
  }



}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# mongoDB主从读写分离  # mongoDB主从读写分离详解  # mongoDB主从读写分离实例代码  # Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例  # Python实现批量读取图片并存入mongodb数据库的方法示例  # python读取json文件并将数据插入到mongodb的方法  # 了不起的node.js读书笔记之mongodb数据库交互  # mongodb的写操作  # mongodb与sql关系型数据比较  # mongodb使用c#驱动数据插入demo  # c#操作mongodb插入数据效率  # mongodb实现数组对象求和方法实例  # Mongodb读数据操作  # 您的  # 希望能  # 点击查看  # 不符合  # 谢谢大家  # 来实现  # 连接数据库  # chexun  # ChexunMongoOptions  # chexunMongoReadOptions  # constructor  # arg  # dbname  # slaveOk  # true  # threadsAllowedToBlockForConnectionMultiplier  # connectionsPerHost  # ServerAddress  # PropertyPlaceholderConfigurer  # property 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何获取PHP WAP自助建站系统源码?  Python文件操作最佳实践_稳定性说明【指导】  如何撰写建站申请书?关键要点有哪些?  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  如何用AWS免费套餐快速搭建高效网站?  zabbix利用python脚本发送报警邮件的方法  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  Laravel如何实现本地化和多语言支持?(i18n教程)  公司门户网站制作流程,华为官网怎么做?  如何在Windows虚拟主机上快速搭建网站?  黑客如何通过漏洞一步步攻陷网站服务器?  如何为不同团队 ID 动态生成多个非值班状态按钮  高防服务器租用如何选择配置与防御等级?  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  如何快速搭建高效香港服务器网站?  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  JS实现鼠标移上去显示图片或微信二维码  如何快速搭建高效WAP手机网站吸引移动用户?  制作电商网页,电商供应链怎么做?  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  Laravel如何实现文件上传和存储?(本地与S3配置)  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  js实现点击每个li节点,都弹出其文本值及修改  香港服务器如何优化才能显著提升网站加载速度?  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  如何用已有域名快速搭建网站?  如何在阿里云ECS服务器部署织梦CMS网站?  如何在云主机快速搭建网站站点?  如何在新浪SAE免费搭建个人博客?  怎样使用JSON进行数据交换_它有什么限制  桂林网站制作公司有哪些,桂林马拉松怎么报名?  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  三星、SK海力士获美批准:可向中国出口芯片制造设备  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  JavaScript如何实现类型判断_typeof和instanceof有什么区别  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  MySQL查询结果复制到新表的方法(更新、插入)  jQuery validate插件功能与用法详解  Laravel怎么为数据库表字段添加索引以优化查询  如何用PHP工具快速搭建高效网站?  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】