Java MongoDB非框架开发进阶--副本集链接开发

最近在用Java做MongoDB的副本集操作开发,由于网上的资料系统性较差,因此,这里进行系统性的记录,供大家参考。

1、MongoDB副本集设置说明

1)在没有进行用户权限设置的情况下进行MongoDB副本集设置,例如:设置副本集rs1

mongod --replSet rs1 --keyFile /home/mongoFile/key/r0 --fork --port 28010 --dbpath /home/mongoFile/data/r0 --logpath=/home/mongoFile/log/r0.log --logappend

mongod --replSet rs1 --keyFile /home/mongoFile/key/r1 --fork --port 28011 --dbpath /home/mongoFile/data/r1 --logpath=/home/mongoFile/log/r1.log --logappend

mongod --replSet rs1 --keyFile /home/mongoFile/key/r2 --fork --port 28012 --dbpath /home/mongoFile/data/r2 --logpath=/home/mongoFile/log/r2.log --logappend

config_rs1 = {_id: 'rs1', members: [{_id: 0, host: '192.168.43.12:28010'},{_id: 1, host: '192.168.43.12:28011'},{_id: 2, host: '192.168.43.12:28012'}]}

rs.initiate(config_rs1)

  2)kill掉所有mongo服务,在各副本中创建数据库,以及权限。例如,要使用admin数据库

mongod --fork --port 28010 --dbpath /home/mongoFile/data/r0 --logpath=/home/mongoFile/log/r0.log --logappend
use admin
db.createUser({user:"admin",pwd:"admin",roles:[{role:"userAdminAnyDatabase",db:"admin"},{role:"clusterAdmin",db:"admin"},{role:"clusterManager",db:"admin"},{role:"readWrite",db:"admin"}]});
mongod --fork --port 28011 --dbpath /home/mongoFile/data/r1 --logpath=/home/mongoFile/log/r1.log --logappend
use admin
db.createUser({user:"admin",pwd:"admin",roles:[{role:"userAdminAnyDatabase",db:"admin"},{role:"clusterAdmin",db:"admin"},{role:"clusterManager",db:"admin"},{role:"readWrite",db:"admin"}]});
mongod --fork --port 28012 --dbpath /home/mongoFile/data/r2 --logpath=/home/mongoFile/log/r2.log --logappend
use admin
db.createUser({user:"admin",pwd:"admin",roles:[{role:"userAdminAnyDatabase",db:"admin"},{role:"clusterAdmin",db:"admin"},{role:"clusterManager",db:"admin"},{role:"readWrite",db:"admin"}]});

  3)现在所有的副本设置操作已经完成,重新启动个副本即可:

mongod --replSet rs1 --keyFile /home/mongoFile/key/r0 --fork --port 28010 --dbpath /home/mongoFile/data/r0 --logpath=/home/mongoFile/log/r0.log --logappend
mongod --replSet rs1 --keyFile /home/mongoFile/key/r1 --fork --port 28011 --dbpath /home/mongoFile/data/r1 --logpath=/home/mongoFile/log/r1.log --logappend
mongod --replSet rs1 --keyFile /home/mongoFile/key/r2 --fork --port 28012 --dbpath /home/mongoFile/data/r2 --logpath=/home/mongoFile/log/r2.log --logappend
2、Java MongoDB副本集操作开发

应用MongoClient链接池即可,示例代码如下:

package Database;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.bson.Document;
import Configuration.ConfigCallBack;
import com.mongodb.BasicDBObject;
import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
public class MongoDBAPI implements DataBaseCallBack{
	public static void main(String[] args) throws InterruptedException{
		System.out.println("start");
		MongoDBAPI m_md = new MongoDBAPI();
		DataBaseParameter m_dp = new DataBaseParameter();
		m_dp.setM_DBname("gps");
		m_dp.setM_IP("192.168.43.4");
		m_dp.setM_Password("liangsheng");
		m_dp.setM_Port(27017);
		m_dp.setM_User("liangsheng");
		m_md.SetInitParameter(m_dp);
		if(m_md.InitDataBase()){
//			DataBaseOperationParameter c_dbop = new DataBaseOperationParameter();
			//插入数据验证
//			c_dbop.setM_TableName("t7070_2016_4_22");
//			c_dbop.setM_Data("aaaaaaaa");
//			c_dbop.setM_Key("PP");
//			c_dbop.setM_Value("ty");
//			m_md.SetOperationParameter(c_dbop);
			//m_md.CreateTable();
//			while(true){
				m_md.Test_InsertData();
//				m_md.QueryDataBase();
//				Thread.sleep(1000);
//			}
		}
		else
			System.out.println("Init error");
	}
	
	//mongodb操作对象
	private MongoClient m_Mongoclient = null;
	private MongoDatabase m_DB = null;
	private MongoCollection<Document> m_Collection = null;
	private volatile boolean isCheck = false;
	
	//mongodb操作初始化参数
	private String m_DBname;
	private List<DataBaseParameter> m_DBparameters;
	
	@Override
	public boolean InitDataBase(){
		if(null == m_Mongoclient){
			try{
				List<ServerAddress> c_addrs = new ArrayList<ServerAddress>();
				List<MongoCredential> c_credentials = new ArrayList<MongoCredential>();
				for(int i = 0;i<m_DBparameters.size();i++){
					DataBaseParameter c_dbp = m_DBparameters.get(i);
					ServerAddress c_serverAddress = new ServerAddress(c_dbp.getM_IP(),c_dbp.getM_Port());  
		            c_addrs.add(c_serverAddress);      
		            //MongoCredential.createScramSha1Credential()三个参数分别为 用户名 数据库名称 密码  
		            MongoCredential c_credential = MongoCredential.createScramSha1Credential(c_dbp.getM_User(), c_dbp.getM_DBname(), c_dbp.getM_Password().toCharArray());   
		            c_credentials.add(c_credential);  
				}
	              
	            //通过连接认证获取MongoDB连接  
	            m_Mongoclient = new MongoClient(c_addrs,c_credentials);  
	            if(null != m_Mongoclient){
	            	//连接到数据库  
		            m_DB = m_Mongoclient.getDatabase(m_DBname);
		            if(null != m_DB){
		            	System.out.println("Connect to database successfully");
		            	return true;
		            }
		            else{
		            	System.out.println("Connect to database failed");
		            }
	            }
	            
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		return false;
	}
	
	@Override
	public void SetInitParameter(DataBaseParameter p_dp){
		if(null == m_DBparameters)
			m_DBparameters = new ArrayList<DataBaseParameter>();
		m_DBname = p_dp.getM_DBname();
		m_DBparameters.add(p_dp);
	}
	
	@Override
	public void DestroyDataBase(){
		if(null != m_Mongoclient){
			m_Mongoclient.close();
			m_Mongoclient = null;
			m_DB = null;
			m_Collection = null;
		}
	}
	
	@Override
	public void setAutoCreateInformation(ConfigCallBack p_config){
	}
	
	@Override
	public void AutoCreateTable(){
	}
	
	//判断表格是否存在
	@Override
	public boolean checkTable(String p_name){
		while(true){
			if(!isCheck){
				isCheck = true;
				try{
					if(m_DB.getCollection(p_name).count() > 0)
						break;
					else{
						isCheck = false;
						return false;
					}
				}catch(IllegalArgumentException e){
					isCheck = false;
					return false;
				}
			}
		}
		isCheck = false;
		return true;
	}
	
	//手动创建表格
	@Override
	public boolean CreateTable(String p_name){
		while(true){
			if(!isCheck){
				isCheck = true;
				try{
					m_DB.createCollection(p_name);
				    System.out.println("create collection success");
				    isCheck = false;
				    return true;
				}catch(Exception e){
					e.printStackTrace();
					isCheck =false;
				}
				return false;
			}
		}
	}
	
	public boolean InsertData(Document p_data,String p_tablename){
		if(null == p_data)
			return false;
		try{
			m_Collection = m_DB.getCollection(p_tablename);
			long c_cout = m_Collection.count();
			p_data.append("_id", c_cout+1);
			m_Collection.insertOne(p_data);
		}catch(Exception e){
			e.printStackTrace();
			return false;
		}
		 
		return true;
	}
	
	@Override
	public boolean beginToDeal(BASEOPERATION p_operation, Object p_data, String p_tablename) {
		// TODO Auto-generated method stub
		if(null == p_operation || null == p_data)
			return false;
		
		if(p_data instanceof Document){
			Document c_data = (Document) p_data;
			switch(p_operation){
			case insert:
				if(InsertData(c_data, p_tablename))
					break;
				else
					return false;
			case query:
				break;
				default:
					return false;
			}
		}
		return true;
	}
	
	//测试查询数据库
	@SuppressWarnings("deprecation")
	public boolean QueryDataBase(){
		try{
			m_Collection = null;
//			m_Collection = m_DB.getCollection("Vehicle7070_2016_4_22");
			m_Collection = m_DB.getCollection("vehile集合");
            System.out.println("集合 test 选择成功");
            
            
            
            //检索所有文档  
            /** 
            * 1. 获取迭代器FindIterable<Document> 
            * 2. 获取游标MongoCursor<Document> 
            * 3. 通过游标遍历检索出的文档集合 
            * */  
            BasicDBObject query = new BasicDBObject();
            query.put("TIME", BasicDBObjectBuilder.start("$gte",new Date(2016-1900,4-1,22,0,0,0)).add("$lte", new Date(2016-1900,4-1,22,23,59,0)).get());
            
            BasicDBObject queryf = new BasicDBObject();
            queryf.put("TIME", -1);
            
            
            FindIterable<Document> c_findIterable = m_Collection.find(new Document("PP","ty")).sort(queryf);
//            FindIterable<Document> c_findIterable = m_Collection.find(query);
            MongoCursor<Document> c_mongoCursor = c_findIterable.iterator();  
            while(c_mongoCursor.hasNext()){  
               System.out.println(c_mongoCursor.next());  
            }  
		}
		catch(Exception e){
			e.printStackTrace();
		}
		return false;
	}
	
	//测试插入语句
	public boolean Test_InsertData(){
		try{
//			m_Collection = m_DB.getCollection(m_DBOP.getM_TableName());
			m_Collection = m_DB.getCollection("粤B 666888_2017_09_06");
            System.out.println("集合 test 选择成功");
            
            //IsoChronology
            //插入文档  
            /** 
            * 1. 创建文档 org.bson.Document 参数为key-value的格式 
            * 2. 创建文档集合List<Document> 
            * 3. 将文档集合插入数据库集合中 mongoCollection.insertMany(List<Document>) 插入单个文档可以用 mongoCollection.insertOne(Document) 
            * */
            
            double d_lanti_n = 3644.5000;
            double d_longi_n = 00930.5000;
            
            for(int i = 0;i<20000;i++){
	            Document dddd = new Document();
	            dddd.append("TIME", new Date());
	            dddd.append("LATI", "N");
	            dddd.append("LONGI", "E");
//	            double d_lanti_n = 3644.5000 + new Random().nextDouble()*(3650.0000-3644.5000);
	            d_lanti_n = d_lanti_n + 0.0009;
	            dddd.append("LATI_N", new DecimalFormat("0000.0000").format(d_lanti_n));
//	            double d_longi_n = 00930.5000 + new Random().nextDouble()*(00940.5000-00930.5000);
	            d_longi_n = d_longi_n + 0.001;
	            dddd.append("LONGI_N", new DecimalFormat("00000.0000").format(d_longi_n));
	            long c_cout = m_Collection.count();
	            dddd.append("_id", c_cout+1);
	            System.out.println(c_cout);
	            m_Collection.insertOne(dddd);  
	            System.out.println("文档插入成功");
	            Thread.sleep(1000);
            }
		}catch(Exception e){
			e.printStackTrace();
		}
		return false;
	}
	
	//测试建表
	public boolean CreateTable(){
		try{
			m_DB.createCollection("vehile集合");
		    System.out.println("集合创建成功");
		    return true;
		}catch(Exception e){
			e.printStackTrace();
		}
		return false;
	}
	
	//测试变量
//	private DataBaseOperationParameter m_DBOP;
	
	//测试使用
//	public void SetOperationParameter(DataBaseOperationParameter p_dbop){
//		m_DBOP = p_dbop;
//	}
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值