mongodb 读写分离以及java端


mongod.exe --bind_ip 192.168.1.202 --port 50001 --logpath E:\MongoDB\logs\log.txt --logappend --dbpath E:\MongoDB\data\db --replSet zhangwei
mongod.exe --bind_ip 192.168.1.202 --port 50002 --logpath E:\MongoDB\logs\log1.txt --logappend --dbpath E:\MongoDB\data\db1 --replSet zhangwei
mongod.exe --bind_ip 192.168.1.202 --port 50003 --logpath E:\MongoDB\logs\log2.txt --logappend --dbpath E:\MongoDB\data\db2  --replSet zhangwei

#连接主服务器,此处设置192.168.1.202:50001为主服务器
mongo --host 192.168.1.202 --port 50001
 
#初始化,哪个服务器先初始化就是主服务器
rs.initiate()


#查看当前状态
rs.status()

#添加副本集
rs.add('192.168.1.202:50002')
rs.add('192.168.1.202:50003')


#连接从服务器
mongo --host 192.168.1.202 --port 50002
mongo --host 192.168.1.202 --port 50003
 
#设置可读
rs.slaveOk()


接下来就是java客户端的配置

package com.system;

import java.util.ArrayList;
import java.util.List;

import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.ReadPreference;
import com.mongodb.ServerAddress;

/*
 * mongodb数据库链接池
 */
public class MongoDBDaoImpl
{
	private MongoClient mongoClient = null;
	private static final MongoDBDaoImpl mongoDBDaoImpl = new MongoDBDaoImpl();// 饿汉式单例模式

	private MongoDBDaoImpl()
	{
		if (mongoClient == null)
		{
			ReadPreference preference = ReadPreference.secondary();  
			MongoClientOptions.Builder buide = new MongoClientOptions.Builder();
			buide.connectionsPerHost(100);// 与目标数据库可以建立的最大链接数
			buide.connectTimeout(1000 * 60 * 20);// 与数据库建立链接的超时时间
			buide.maxWaitTime(100 * 60 * 5);// 一个线程成功获取到一个可用数据库之前的最大等待时间
			buide.threadsAllowedToBlockForConnectionMultiplier(100);
			buide.maxConnectionIdleTime(0);
			buide.maxConnectionLifeTime(0);
			buide.socketTimeout(0);
			buide.socketKeepAlive(true);
			MongoClientOptions myOptions = buide.readPreference(preference).build();
			try
			{
				List<ServerAddress> addresses = new ArrayList<ServerAddress>();  
				ServerAddress address1 = new ServerAddress("192.168.1.202" , 50001); 
				ServerAddress address2 = new ServerAddress("192.168.1.202" , 50002); 
                ServerAddress address2 = new ServerAddress("192.168.1.202" , 50003); 
				addresses.add(address1);  
				addresses.add(address2); 
				mongoClient = new MongoClient(addresses,myOptions); 
			} catch (Exception e)
			{
				e.printStackTrace();
			}
		}
	}

	public static MongoDBDaoImpl getMongoDBDaoImpl()
	{
		return mongoDBDaoImpl;
	}



	public DBCollection getCollection(String dbName, String collectionName)
	{
		DB db = mongoClient.getDB(dbName);
		return db.getCollection(collectionName);
	}

}

需要实现为mongodb分压,我们的读都放到secondary节点,写都放到primary节点

ReadPreference preference = ReadPreference.secondary();  

MongoClientOptions myOptions = buide.readPreference(preference).build();

 

这两句最重要。这两句实现了读数据只到secondary节点。

 

接下来是java api对数据的操作

package com.system;
import java.util.List;

import org.json.JSONObject;

import util.CommEnum;

import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.ReadPreference;


public class MongoDB {

	//  private static final String HOST = PublicParameter.mongo_ip;
	//  private static final int PORT = PublicParameter.mongo_port;
	//    private static final String HOST = "218.5.26.21";
	//    private static final int PORT = 27017;
	//    private static Mongo mongo;
	//    private static DB db;
	//    
	//    static {
	//        // 连接到MongoDB
	//        mongo = new Mongo(HOST, PORT);
	//        // 打开数据库 testDB
	//       
	//    }
	//    


	// ====================================查询开始==============================================
	/**
	 * @Title: queryOne
	 * @Description: TODO 查询 name为 张三的 一条记录  21212214321432432324
	 * @param dbCollection
	 * @return: void
	 */
	public static DBObject queryOne(String dbName, String collName, DBObject documents){
		DBCollection dbCollection = MongoDBDaoImpl.getMongoDBDaoImpl().getCollection(dbName, collName);
		//        DBObject documents = new BasicDBObject();
		//        documents.put("name","张三");
		DBObject result = dbCollection.findOne(documents);
		return result;
	}

	/**
	 * @Title: queryOne
	 * @Description: TODO 查询 name为 张三的 一条记录  21212214321432432324
	 * @param dbCollection
	 * @return: void
	 */
	public static DBCursor queryIn(String dbName, String collName, DBObject queryCondition){
		DBCollection dbCollection = MongoDBDaoImpl.getMongoDBDaoImpl().getCollection(dbName, collName);
		DBObject index = new BasicDBObject();
		index.put("c_phone", 1);
		index.put("c_account_id", 1);
		dbCollection.createIndex(index);
		 DBCursor limit = dbCollection.find(queryCondition).skip(0).limit(1);
		return limit;
	}

	public static long queryCount(String dbName, String collName, DBObject queryCondition){
		DBCollection dbCollection = MongoDBDaoImpl.getMongoDBDaoImpl().getCollection(dbName, collName);
		DBObject index = new BasicDBObject();
		index.put("c_phone", 1);
		index.put("black_state", 1);
		dbCollection.createIndex(index);
		long count = dbCollection.count(queryCondition);
	
		return count;
	}

	/**
	 * @Title: queryPage
	 * @Description: TODO 分页查询
	 * @param dbCollection
	 * @return: void
	 */
	public static DBCursor queryPage(String dbName, String collName,int skip,int limit){
		DBCollection dbCollection = MongoDBDaoImpl.getMongoDBDaoImpl().getCollection(dbName, collName);
		DBCursor cursor = dbCollection.find().skip(skip).limit(limit);
		//        while (cursor.hasNext()) {
		//            System.out.println(cursor.next());
		//        }
		return cursor;
	}

	/** 
	 * 
	 * @Title: queryPage
	 * @Description: TODO 分页查询
	 * @param dbCollection
	 * @return: void
	 */
	public static DBCursor queryPage(String dbName, String collName,int skip,int limit,DBObject where){

		DBCollection dbCollection = MongoDBDaoImpl.getMongoDBDaoImpl().getCollection(dbName, collName);
		DBCursor cursor = dbCollection.find(where).skip(skip).limit(limit);
		//        while (cursor.hasNext()) {
		//            System.out.println(cursor.next());
		//        }
		return cursor;
	}



	/**
	 * @Title: queryRange
	 * @Description: TODO 范围查询,查询 第3条 到 第5条 之间的记录
	 * @param dbCollection
	 * @return: void
	 */
	public static DBCursor queryRange(String dbName, String collName,DBObject range,String column_name) {
		DBCollection dbCollection = MongoDBDaoImpl.getMongoDBDaoImpl().getCollection(dbName, collName);
		//        DBObject range = new BasicDBObject();
		//        range.put("$gte", 50);
		//        range.put("$lte", 52);

		DBObject dbObject = new BasicDBObject();
		dbObject.put(column_name, range);
		DBCursor cursor = dbCollection.find(dbObject);
		//        while (cursor.hasNext()) {
		//            System.out.println(cursor.next());
		//        }
		return cursor;
	}

	/**'
	 * @Title: queryList
	 * @Description: TODO 查询出全部的 记录
	 * @param dbCollection
	 * @return: void
	 */
	public static DBCursor queryList(String dbName, String collName) {
		DBCollection dbCollection = MongoDBDaoImpl.getMongoDBDaoImpl().getCollection(dbName, collName);
		DBCursor cursor = dbCollection.find();
		//        DBObject dbObject = null;
		//        while(cursor.hasNext()){
		//            dbObject = cursor.next();
		//            System.out.println(dbObject);
		//        }
		return cursor;
	}

	// ====================================增加开始==============================================
	/**
	 * @Title: addOne
	 * @Description: TODO 新增 一条记录
	 * @param dbCollection
	 * @return: void
	 */
	public static void addOne(String dbName, String collName,DBObject documents){
		DBCollection dbCollection = MongoDBDaoImpl.getMongoDBDaoImpl().getCollection(dbName, collName);
		//        DBObject documents = new BasicDBObject();
		//        documents.put("xxx", 1);
		dbCollection.insert(documents);
	
	}

	/**
	 * @Title: addList 
	 * @Description: TODO 批量新增 记录    , 增加的记录 中 可以使用各种数据类型
	 * @param dbCollection
	 * @return: void
	 */
	public static void addList(String dbName, String collName, List<DBObject> listdbo){
		DBCollection dbCollection = MongoDBDaoImpl.getMongoDBDaoImpl().getCollection(dbName, collName);
		//        DBObject dbObject = new BasicDBObject();
		//        dbObject.put("name", "老张");
		//        dbObject.put("age", 52);
		//        dbObject.put("job", "看守老王");
		//        dbObject.put("remark", new BasicDBObject("address", "广东省深圳市").append("street", "深南大道888号"));
		//        listdbo.add(dbObject);

		dbCollection.insert(listdbo);
	}

	//    /**
	//     * @Title: addByJson
	//     * @Description: TODO json转对象后 ,执行新增
	//     * @param dbCollection
	//     * @return: void
	//     */
	//    public static void addByJson(DBCollection dbCollection){
	//        String json = "{ \"name\" : \"王五\" , \"age\" : 66 , \"job\" : \"看守老王\" , \"remark\" : { \"address\" : \"广东省深圳市\" , \"street\" : \"深南大道888号\"}}";
	//        DBObject dbObject = (DBObject) JSON.parse(json);
	//        dbCollection.insert(dbObject);
	//    }

	// ====================================修改开始==============================================


	/**
	 * @Title: updateMulti
	 * @Description: TODO 修改 记录
	 * @param dbCollection
	 * @return: void
	 */
	public static void updateMulti(String dbName, String collName,DBObject newdbObject, DBObject olddbObject,boolean is_insert) {
		DBCollection dbCollection = MongoDBDaoImpl.getMongoDBDaoImpl().getCollection(dbName, collName);
		//        DBObject newdbObject = new BasicDBObject();
		//        newdbObject.put("name", "张三");
		//        
		//        DBObject olddbObject = new BasicDBObject();
		//        olddbObject.put("name", "yisheng");
		// 需要加上这个
		DBObject upsertValue = new BasicDBObject("$set", newdbObject);  
		// 后面的两个参数(is_insert,):1.若所更新的数据没有,则插入 ; 2、同时更新多个符合条件的文档(collection) 
		dbCollection.update(olddbObject, upsertValue, is_insert, false);
	}

	// ====================================删除开始==============================================
	/**
	 * @Title: deleteFirst
	 * @Description: TODO 删除第一个
	 * @param 
	 * @return: void
	 */
	public static void deleteFirst(String dbName, String collName){
		DBCollection dbCollection = MongoDBDaoImpl.getMongoDBDaoImpl().getCollection(dbName, collName);
		DBObject dbObject = dbCollection.findOne();
		dbCollection.remove(dbObject);
	}

	/**
	 * @Title: deleteOne
	 * @Description: TODO 删除指定的一条记录
	 * @param dbCollection
	 * @return: void
	 */
	public static void deleteOne(String dbName, String collName,String key,String value){
		DBCollection dbCollection = MongoDBDaoImpl.getMongoDBDaoImpl().getCollection(dbName, collName);
		DBObject dbObject = new BasicDBObject();
		dbObject.put(key, value);
		dbCollection.remove(dbObject);
	}

	/**
	 * @Title: deleteByIn
	 * @Description: TODO 删除多条记录      例如:select * from tb where name in('12','34')
	 * @param dbCollection
	 * @return: void
	 */
	public static void deleteByIn(String dbName, String collName,List<String> list,String column_name) {
		DBCollection dbCollection = MongoDBDaoImpl.getMongoDBDaoImpl().getCollection(dbName, collName);
		//        List<String> list = new ArrayList<String>();
		//        list.add("老张");
		//        list.add("老王");
		//        list.add("张三");
		DBObject dbObject = new BasicDBObject();
		dbObject.put("$in", list);
		DBObject delObject = new BasicDBObject();
		delObject.put(column_name, dbObject);
		dbCollection.remove(delObject);
	}

	/**
	 * @Title: deleteByIn
	 * @Description: TODO 删除表
	 * @param dbCollection
	 * @return: void
	 */
	public static void deleteByTable(String dbName, String collName) {
		DBCollection dbCollection = MongoDBDaoImpl.getMongoDBDaoImpl().getCollection(dbName, collName);
		dbCollection.drop();
	}


	/**
	 * @Title: deleteAll
	 * @Description: TODO 删除全部的记录
	 * @param dbCollection
	 * @return: void
	 */
	public static void deleteAll(String dbName, String collName){
		DBCollection dbCollection = MongoDBDaoImpl.getMongoDBDaoImpl().getCollection(dbName, collName);
		DBCursor cursor = dbCollection.find();
		while(cursor.hasNext()){
			dbCollection.remove(cursor.next());
		}
	}

	/**
	 * @Title: deleteAll
	 * @Description: TODO 删除某些记录
	 * @param dbCollection
	 * @return: void
	 */
	public static void deleteAll(String dbName, String collName,DBObject filter){
		DBCollection dbCollection = MongoDBDaoImpl.getMongoDBDaoImpl().getCollection(dbName, collName);
		DBCursor cursor = dbCollection.find(filter).skip(1).limit(10);
		while(cursor.hasNext()){
			dbCollection.remove(cursor.next());
		}
	}



}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

紫川琴秀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值