MongoDB(online) 优化

1. find、findOne

  • 项目实例
MongoTemplate mongoTemplate = mongodbClient.getMongoTemplate();
DBCollection cursor = mongoTemplate.getCollection("vip_batchsend_message");
BasicDBObject query = new BasicDBObject();
query.put("sms_code", sms_code);
query.put("open_id", open_id); JSONObject message = new JSONObject(); DBCursor cursor1 = cursor.find(query);
LOGGER.info("-------------sms_code:" + sms_code + "----open_id:" + open_id + "--" + cursor1.size());
if (cursor1.size() > 0) {
DBObject dBObject = cursor1.next();
String corp_code = dBObject.get("corp_code").toString();
.....
  • 简单阐述
    1. 代码意图是如果记录存在就修改
    2. 只需要判断是否存在就完成目的
    3. find返回的是DBCursor,这里不合适,我们只需要知道是否存在即可
    4. 修改建议
      1. 固定的条件提前预先组合
      2. find改成findOne
      3. 判断只需要查询一条记录即可,用findOne就可以,直接获取一个Object,判断后即可根据Key获取Value进行后续操作
  • 建议修改
BasicDBObject query = new BasicDBObject();
query.put("sms_code", sms_code);
query.put("open_id", open_id);
MongoTemplate mongoTemplate = mongodbClient.getMongoTemplate();
JSONObject message = new JSONObject();
DBCollection cursor = mongoTemplate.getCollection("vip_batchsend_message");
DBObject dbObject = cursor.findOne(query);
if (dbObject.isPartialObject()) {
LOGGER.info("-------------sms_code:" + sms_code + "----open_id:" + open_id + "--" + 1);
String corp_code = dbObject.get("corp_code").toString();
String vip_id = dbObject.get("vip_id").toString();
Data data_corp_code = new Data("corp_code", corp_code, ValueType.PARAM);
Data data_vip_id = new Data("vip_ids", vip_id, ValueType.PARAM);
......

2. 操作 vip_emp_relation 的一个公共方法

  • 项目实例
 public DBCursor selectRelation(String app_user_name, String open_id) throws SQLException {
MongoTemplate mongoTemplate = mongodbClient.getMongoTemplate();
DBCollection cursor = mongoTemplate.getCollection(WxConst.table_vip_emp_relation); Map keyMap = new HashMap();
keyMap.put("_id", app_user_name + open_id);
BasicDBObject queryCondition = new BasicDBObject();
queryCondition.putAll(keyMap);
DBCursor dbCursor = cursor.find(queryCondition);
return dbCursor;
}
  • 简单阐述

    1. 查看此方法的引用,基本是做判断使用,没必要返回一个Cursor
    2. 如果引用的方法,有长任务,然后再操作,就会等待很长时间不释放资源
  • 建议修改

     public DBObject selectRelation(String app_user_name, String open_id) throws SQLException {
    Map keyMap = new HashMap();
    keyMap.put("_id", app_user_name + open_id);
    BasicDBObject queryCondition = new BasicDBObject();
    queryCondition.putAll(keyMap);
    MongoTemplate mongoTemplate = mongodbClient.getMongoTemplate();
    DBCollection cursor = mongoTemplate.getCollection(WxConst.table_vip_emp_relation);
    DBObject dbCursor = cursor.findOne(queryCondition);
    return dbCursor;
    }

3. 查询记录数

  • 项目实例
BasicDBObject basicDBObject=new BasicDBObject();
basicDBObject.put("activity_code",activity_code);
basicDBObject.put("open_id",open_id);
basicDBObject.put("status","1");
int count=cursor.find(basicDBObject).count();
basicDBObject.put("sign_status","Y");
int sign_count=cursor.find(basicDBObject).count();
if(sign_count>0){
result="您已签到成功,请勿重复签到";
}else {
if (count > 0) {
BasicDBObject query=new BasicDBObject();
query.put("activity_code",activity_code);
query.put("open_id",open_id);
......
  • 简单阐述

    1. 根据条件获取记录数
    2. 没必要先获取文档游标再查询记录数
  • 建议修改

BasicDBObject basicDBObject=new BasicDBObject(); basicDBObject.put("activity_code",activity_code);
basicDBObject.put("open_id",open_id);
basicDBObject.put("status","1");
Long count=cursor.count(basicDBObject);
basicDBObject.put("sign_status","Y");
Long sign_count=cursor.count(basicDBObject);
if(sign_count>0){
result="您已签到成功,请勿重复签到";
}else {
if (count > 0) {
BasicDBObject query=new BasicDBObject();
query.put("activity_code",activity_code);
query.put("open_id",open_id);
......

4. save、insert

  • 项目实例
if (cursor.find(basicDBObject).count() > 0){
BasicDBObject basicDBObject1=new BasicDBObject();
basicDBObject1.put("sign_status","Y");
basicDBObject1.put("sign_date",Common.DATETIME_FORMAT.format(new Date()));
BasicDBObject update=new BasicDBObject();
update.put("$set",basicDBObject1);
cursor.update(basicDBObj,update,true,false);
}else {
BasicDBObject dbObject = new BasicDBObject();
dbObject.put("_id", app_id + "_" + activity_code + "_" + open_id);
dbObject.put("corp_code", corp_code);
dbObject.put("sign_status","Y");
dbObject.put("sign_date",Common.DATETIME_FORMAT.format(new Date()));
dbObject.put("app_id", app_id);
dbObject.put("activity_code", activity_code);
dbObject.put("status", "0");
dbObject.put("open_id", open_id);
dbObject.put("vip", vip_array.getJSONObject(0));
dbObject.put("modified_date", Common.DATETIME_FORMAT.format(new Date()));
dbObject.put("created_date", Common.DATETIME_FORMAT.format(new Date()));
cursor.save(dbObject);
}
......
  • 简单阐述

    1. save 是先根据_id查询再修改,如果已经确认记录不存在可以省去查找的功能直接insert
  • 建议修改

if (cursor.find(basicDBObject).count() > 0){
BasicDBObject basicDBObject1=new BasicDBObject();
basicDBObject1.put("sign_status","Y");
basicDBObject1.put("sign_date",Common.DATETIME_FORMAT.format(new Date()));
BasicDBObject update=new BasicDBObject();
update.put("$set",basicDBObject1);
cursor.update(basicDBObj,update,true,false);
}else {
BasicDBObject dbObject = new BasicDBObject();
dbObject.put("_id", app_id + "_" + activity_code + "_" + open_id);
dbObject.put("corp_code", corp_code);
dbObject.put("sign_status","Y");
dbObject.put("sign_date",Common.DATETIME_FORMAT.format(new Date()));
dbObject.put("app_id", app_id);
dbObject.put("activity_code", activity_code);
dbObject.put("status", "0");
dbObject.put("open_id", open_id);
dbObject.put("vip", vip_array.getJSONObject(0));
dbObject.put("modified_date", Common.DATETIME_FORMAT.format(new Date()));
dbObject.put("created_date", Common.DATETIME_FORMAT.format(new Date()));
cursor.insert(dbObject);
}
......

5. 总结

  1. 以上是目前发现的问题及建议,会继续Review
  2. 涉及到IO的操作标配就是尽晚打开尽早释放
  3. 阿里的MongoDB默认没有启动读写分离(我已经测试确认过),我测试后会加上
  4. 业务实现过程,尽可能结构化数据,介绍拼接出错或Key不存在的异常
  5. 涉及到Cursor尽快手动关闭
  6. 其它项目也可以参考,或者抛出来

MongoDB(online) 优化的更多相关文章

  1. MongoDB 性能优化五个简单步骤

    MongoDB 一直是最流行的 NoSQL,而根据 DB-Engines Ranking 最新的排行,时下 MongoDB 已经击败 PostgreSQL 跃居数据库总排行的第四位,仅次于 Oracl ...

  2. mongodb可以通过profile来监控数据 (mongodb性能优化)

    mongodb可以通过profile来监控数据 (mongodb性能优化)   开启 Profiling  功能 ,对慢查询进行优化: mongodb可以通过profile来监控数据,进行优化. 查看 ...

  3. MongoDB性能优化

    一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样.其实可以这样说说,索引 ...

  4. MongoDB性能优化指南

    一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样.其实可以这样说说,索引 ...

  5. mongodb分页优化

    现在参与一个项目的开发,需要用java查询mongodb数据库,在这里分页用的skip sort 和limit结合,查询语句如下(已经在相关字段建立索引) DBCursor cursor = coll ...

  6. jemalloc Mongodb Nginx 优化

    下载 http://www.canonware.com/jemalloc/download.html 下载 wget http://www.canonware.com/download/jemallo ...

  7. mongodb 参数优化

    1.大部分IO操作为随机IO,建议采用SSD或PCIE,普通硬盘RAID10 2.IO调度算法.普通磁盘:deadline避免IO请求出现“饥饿”现象,SSD/PCIE:noop简单的先进先出处理请求 ...

  8. MongoDB使用优化

    一.监控 mongodb可以通过profile来监控数据,进行优化. 查看当前是否开启profile功能用命令:db.getProfilingLevel()返回level等级,值为0|1|2,分别代表 ...

  9. 开发高性能的MongoDB应用—浅谈MongoDB性能优化(转)

    出处:http://www.cnblogs.com/mokafamily/p/4102829.html 性能与用户量 “如何能让软件拥有更高的性能?”,我想这是一个大部分开发者都思考过的问题.性能往往 ...

  10. 开发高性能的MongoDB应用—浅谈MongoDB性能优化

    关联文章索引: 大数据时代的数据存储,非关系型数据库MongoDB 性能与用户量 “如何能让软件拥有更高的性能?”,我想这是一个大部分开发者都思考过的问题.性能往往决定了一个软件的质量,如果你开发的是 ...

随机推荐

  1. Difference **面向过程(或者叫结构化)分析方法**面向对象分析方法

    面向过程和面向对象的区别 面向过程是分析出解决问题所需要的步骤,然后一步步实现,面向对象是把构成问事件分解成各个对象,建立对象的目的是为了描述某个事物在整个解决问题的步骤中的行为. 可以说面向对象是从 ...

  2. Qt 学习之路 2(29):绘制设备

    Qt 学习之路 2(29):绘制设备 豆子 2012年12月3日 Qt 学习之路 2 28条评论 绘图设备是继承QPainterDevice的类.QPaintDevice就是能够进行绘制的类,也就是说 ...

  3. tornado 08 数据库-ORM-SQLAlchemy-表关系和简单登录注册

    tornado 08 数据库-ORM-SQLAlchemy-表关系和简单登录注册 引言 #在数据库,所谓表关系,只是人为认为的添加上去的表与表之间的关系,只是逻辑上认为的关系,实际上数据库里面的表之间 ...

  4. Python web前端 04 盒子模型

    Python web前端 04 盒子模型 盒子模型是由内容(content).内边距(padding).外边距(margin).边框(border)组成的 一.边框 border #border 边框 ...

  5. 小Q系列故事——最佳裁判

    Time Limit:200MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 过去的2012年 ...

  6. abp架构添加实体并使用迁移功能生成表

    参考: https://aspnetboilerplate.com/Pages/Articles/Introduction-With-AspNet-Core-And-Entity-Framework- ...

  7. POJ_1862 Stripies 【贪心】

    一.题面 POJ1862 二.分析 反省一下,自己英语水平着实不行,该题其实就是问若给出若干个这种生物,根据这种体重变换方式,最终合并成一个后,体重最少是多少.根据公式 $m = 2\sqrt{m_{ ...

  8. Scala 中 for 循环 和 generator 的使用例子

    这个例子是,从每个list中,找到age最大的那个node. class Node(vName: String, vAge: Int) { // Entity class var name: Stri ...

  9. UVa 253

    UVa 253 #include <iostream> #include <cstdio> #include <string> #include <cstri ...

  10. ELK 搭建实战

    一, 软件介绍 01,为什么用到ELK? 一般我们需要进行日志分析场景:直接在日志文件中 grep.awk 就可以获得自己想要的信息.但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大 如何 ...