最近继续学习Mongodb的根本原因,是为了解决今天的问题。
项目中用到了Hbase,生产环境服务器用了3台,但是不够稳定,每2天左右,就连不上了。
重启就好了,当然,这是一个历史遗留问题。
我在想,是不是连接没有关闭,每次都是建立新的连接?
瞅瞅Java访问Hbase的代码,都close了额。

原来的Hbase,用Java访问,有add/update、get、getList3个接口。
现在要加上Mongodb存储,尽可能保证Hbase和Mongodb数据同步。
优先使用Mongodb中的数据,其次才使用HBase中的数据。

今后有可能不再使用Hbase。

在项目刚刚启动的时候,需要同步HBase中的数据到Mongodb。
简化代码如下
public class ProjectDetailClient {
private ProjectDetailHbaseClient hbase = new ProjectDetailHbaseClient();
private ProjectDetailMongodbClient mongodb = new ProjectDetailMongodbClient();

// 2个都增加
public void add(ProjectDetail projectDetail) {
}


可以这么理解,原来直接使用ProjectDetailHbaseClient,方法名称都一样。
后台增加了ProjectDetailMongodbClient,方法的实现也一样,可以看作是一套接口的2套实现。
ProjectDetailClient的add等具体方法中,会处理2个接口的调用、数据同步等逻辑问题。

完整代码如下

package com.hanhai.zrb.api.mongodb;

import java.util.List;

import org.apache.log4j.Logger;

import casia.isiteam.zrb.hbase.client.ProjectDetailHbaseClient;

import com.hanhai.zrb.model.project.ProjectDetail;

public class ProjectDetailClient {
private ProjectDetailHbaseClient hbase = new ProjectDetailHbaseClient();
private ProjectDetailMongodbClient mongodb = new ProjectDetailMongodbClient();
private Logger log = Logger.getLogger(getClass()); // 2个都增加
public void add(ProjectDetail projectDetail) {
log.info("Add ProjectDetail for hbase.");
hbase.insertProjectDetail(projectDetail);
log.info("Add ProjectDetail for mongodb.");
mongodb.add(projectDetail);
} // 2个都更新
public void update(ProjectDetail projectDetail) {
if (projectDetail.getId() == null) {
log.error("ProjectDetail is is null,Cantnot update~");
return;
}
Long id = projectDetail.getId(); ProjectDetail one = mongodb.get(id);
// Mongodb,如果存在,更新
if (one != null) {
log.info("Update ProjectDetail,Mongodb exists,id="+id);
mongodb.update(projectDetail);
}
// 不存在,就增加
else {
log.info("Update ProjectDetail,Mongodb not exists,id="+id);
mongodb.add(projectDetail);
} // hbase增加和更新是同一个接口
log.info("Update ProjectDetail for hbase,id="+id);
hbase.insertProjectDetail(projectDetail);
} // 2个都查询,优先使用Mongodb
public ProjectDetail get(long id) {
ProjectDetail one = null;
ProjectDetail hbaseOne = hbase.getProjectDetail(id);
ProjectDetail mongodbOne = mongodb.get(id);
if (mongodbOne != null) {
one = mongodbOne;
log.info("Project Detail,Mongodb exists,Use Mongodb," + one);
} else if (hbaseOne != null) {
one = hbaseOne;
log.info("Project Detail,Mongodb not exists,Use Hbase," + one);
log.info("Add Project Detail To Mongodb");
// 同步Hbase中的数据到Mongodb
mongodb.add(hbaseOne);
}
return one;
} // 2个都查询,优先使用Mongodb
public List<ProjectDetail> getProjectInfoBasic(List<Long> idList) {
List<ProjectDetail> list = null;
List<ProjectDetail> hbaseList = hbase.getProjectInfoBasic(idList);
List<ProjectDetail> mongodbList = mongodb.getProjectInfoBasic(idList);
// 优先使用Mongodb中的,条件,Mongodb中的个数不小于hbase中的
if (mongodbList != null) {
int size = mongodbList.size();
if (hbaseList == null || hbaseList.size() <= size) {
list = mongodbList;
log.info("ProjectDetail list,Use MongodbList,size=" + size);
}else{
list = hbaseList;
log.info("ProjectDetail list,Use HbaseList,size=" + hbaseList.size()+",mongodb count "+size+" < hbase count "+hbaseList.size());
}
}
// 其次使用Hbase中的,不会同步hbase中的数据到Mongodb
else if (hbaseList != null) {
list = hbaseList;
log.info("ProjectDetail list,Use HbaseList,size=" + hbaseList.size());
}
return list;
}
}

package com.hanhai.zrb.api.mongodb;

import java.util.ArrayList;
import java.util.List; import org.apache.log4j.Logger; import com.hanhai.zrb.model.project.ProjectDetail;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.CommandResult;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.WriteResult; public class ProjectDetailMongodbClient { public static final String CON_NAME = "projectDetail"; private Logger log = Logger.getLogger(getClass()); public void add(ProjectDetail projectDetail) {
DBCollection con = getCon();
add(con, projectDetail);
} private DBCollection getCon() {
DB db = MongoUtil.db();
DBCollection con = db.getCollection(CON_NAME);
return con;
} // 增加
private DBCollection add(DBCollection projectDetailCollection,
ProjectDetail projectDetail) {
DBObject object = BeanUtil.bean2DBObject(projectDetail);
WriteResult wr = projectDetailCollection.insert(object);
CommandResult cr = wr.getLastError();
log.info("Add new projectDetail,result:" + cr);
return projectDetailCollection;
} public void update(ProjectDetail projectDetail) {
DBCollection con = getCon();
update(con, projectDetail);
} // 修改
private void update(DBCollection collection, ProjectDetail projectDetail) {
if (projectDetail.getId() == null) {
log.error("Update projectDetail,must have a unique id");
return;
} BasicDBObject updateCondition = new BasicDBObject();
updateCondition.append("id", projectDetail.getId()); DBObject newObject = BeanUtil.bean2DBObject(projectDetail); DBObject updateSetValue = new BasicDBObject("$set", newObject);
WriteResult wr = collection.update(updateCondition, updateSetValue);
log.info("Update new projectDetail,result:" + wr);
} public ProjectDetail get(long id) {
DBCollection con = getCon();
ProjectDetail projectDetail = findById(con, id);
return projectDetail;
} // 从集合中,根据ID查找
private ProjectDetail findById(DBCollection collection, Long id) {
BasicDBObject searchProjectDetailById = new BasicDBObject();
searchProjectDetailById.append("id", id);
ProjectDetail projectDetailBefore = null;
// findOne方法更简单一些
DBCursor cursor = collection.find(searchProjectDetailById);
while (cursor.hasNext()) {
DBObject articleObject = cursor.next();
if (articleObject != null) {
projectDetailBefore = objectToArticle(articleObject);
String internalId = articleObject.get("_id").toString();
projectDetailBefore.setMongoId(internalId);
}
}
cursor.close();
return projectDetailBefore;
} // 对象转换
private ProjectDetail objectToArticle(DBObject object) {
ProjectDetail projectDetail = new ProjectDetail();
// 用工具方法转换,手动转换,需要判断类型,比较麻烦
projectDetail = BeanUtil.dbObject2Bean(object, projectDetail);
return projectDetail;
} public List<ProjectDetail> getProjectInfoBasic(List<Long> idList) {
DBCollection con = getCon();
List<ProjectDetail> list = findByIdList(con, idList);
return list;
} // 根据ID集合查找
private List<ProjectDetail> findByIdList(DBCollection collection,
List<Long> idList) {
BasicDBList values = new BasicDBList();
values.addAll(idList); DBObject inQuery = new BasicDBObject("$in", values); DBObject con = new BasicDBObject();
con.put("id", inQuery);
DBCursor cursorIdArray = collection.find(con); List<ProjectDetail> projectDetailList = new ArrayList<ProjectDetail>();
while (cursorIdArray.hasNext()) {
DBObject articleObject = cursorIdArray.next();
ProjectDetail projectDetail = new ProjectDetail();
BeanUtil.dbObject2Bean(articleObject, projectDetail);
String mongoId = articleObject.get("_id").toString();
projectDetail.setMongoId(mongoId); projectDetailList.add(projectDetail);
}
return projectDetailList;
} }

ProjectDetailHbaseClient代码较为复杂,和ProjectDetailMongodbClient类似,不再贴了。

Mongodb总结5-通过装饰模式,用Mongodb解决Hbase的不稳定问题的更多相关文章

  1. mongoDb CPU利用率100%的分析和解决

    在公司的项目中,突然出现过一个情况,mongodb 的CPU利用率到达100%,导致服务器这边卡死了,请求了半天无响应,提示请求超时. 因为,当时APP用户可能会在某一个时间段集中的使用,所以,请求量 ...

  2. MongoDB学习:(二)MongoDB简单使用

    MongoDB学习:(二)MongoDB简单使用 MongoDB使用: 执行mongodb的操作之前,我们需要运行命令,来进入操作命令界面 >mongo 提示该错误,说明我们系统缺少一个补丁,该 ...

  3. MongoDB学习:(一)MongoDB安装

    MongoDB学习:(一)MongoDB安装 MongoDB介绍:     直接百科了: MongoDB安装: 1:下载安装: MongoDB安装:https://www.mongodb.com/do ...

  4. 基于C#的MongoDB数据库开发应用(1)--MongoDB数据库的基础知识和使用

    在花了不少时间研究学习了MongoDB数据库的相关知识,以及利用C#对MongoDB数据库的封装.测试应用后,决定花一些时间来总结一下最近的研究心得,把这个数据库的应用单独作为一个系列来介绍,希望从各 ...

  5. Mongodb 笔记09 备份、部署MongoDB

    备份 1. 只有在有信心能在紧急情况下完成迅速部署的情况下,备份才是有用的.所以,无论选择了哪种备份技术,一定要对备份及恢复备份的操作进行练习,知道了然于心. 2. 通常情况下,应对副本集的非主节点( ...

  6. MongoDB(索引及C#如何操作MongoDB)(转载)

    MongoDB(索引及C如何操作MongoDB) 索引总概况 db.test.ensureIndex({"username":1})//创建索引 db.test.ensureInd ...

  7. window服务器上mongodb的安装与如何将mongodb设置为服务,为mongodb设置管理用户,mongodb连接字符串配置

    最近公司有一个项目模块让用nosql-mongodb替换了,故,对mongodb做了一点研究,然后分享一下! 1.首先说一下安装时的坑 下载mongodb,如果你从官网下载,将会是一件很慢的事情,在公 ...

  8. 孤荷凌寒自学python第五十六天通过compass客户端和mongodb shell 命令来连接远端MongoDb数据库

    孤荷凌寒自学python第五十六天通过compass客户端和mongodb shell 命令来连接远端MongoDb数据库 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第二 ...

  9. 搭建高可用mongodb集群(一)——mongodb配置主从模式

    转载自:LANCEYAN.COM 在大数据的时代,传统的关系型数据库要能更高的服务必须要解决高并发读写.海量数据高效存储.高可扩展性和高可用性这些难题.不过就是因为这些问题Nosql诞生了. NOSQ ...

随机推荐

  1. ES6学习笔记(一)新的变量定义命令let和const

    1.一些历史 ES6(ECMAScript 6.0)是 JavaScript 语言的新一代标准,于2015 年 6 月正式发布,距今已经4年了,它的目标,是使得 JavaScript 语言可以用来编写 ...

  2. Centos7部署phpMyAdmin系统

    phpMyAdmin是一个使用PHP语言编写,用来管理MYSQL数据库的Web应用系统 一:安装phpMyadmin 下载phpMyadmin最新版本4.8 wget https://files.ph ...

  3. SpringBoot 整合 Mybatis 和 Mysql (详细版)

    结构如下 1.引入相关依赖 <!--mysql--><dependency> <groupId>mysql</groupId> <artifact ...

  4. ognl.OgnlException: target is null for setProperty(null,&quot;XXXX&quot;...)

    今天遇到了这个奇葩问题,最后来回比对了一下前辈写过的一段完整代码后才发现问题. Error大概描写叙述为: 警告: Error setting expression 'XXX' with value ...

  5. 聊聊高并发(十九)理解并发编程的几种&quot;性&quot; -- 可见性,有序性,原子性

    这篇的主题本应该放在最初的几篇.讨论的是并发编程最基础的几个核心概念.可是这几个概念又牵扯到非常多的实际技术.比方Java内存模型.各种锁的实现,volatile的实现.原子变量等等,每个都可以展开写 ...

  6. IOS 以随意点为圆心 旋转UIView

    环绕底边中点旋转                     UIView本身是支持旋转的,能够用UIView.transform属性实现旋转. The origin of the transform i ...

  7. jquery13 attr() prop() val() addClass()等 : 对元素属性的操作

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  8. php数组合并有哪三种方法

    php数组合并有哪三种方法 一.总结 一句话总结:array_merge():array_merge_recursive():‘+'号 $a = array('color'=>'red',5,6 ...

  9. jdbc的数据库驱动类DriverManager.getConnection()详解

    1.Oracle8/8i/9i数据库(thin模式) Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); ...

  10. 关于css的入门知识

    css:叠层样式表,给html添加样式的 接下来说一说,在网页中如何嵌套style样式 1.行间样式:把style(*权重1000)作为属性卸载标签里 eg:<p style="col ...