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. 其它项目也可以参考,或者抛出来

最新文章

  1. SHA-256算法
  2. httpclient 调用WebAPI
  3. Unity 插件制作笔记(持续更新)
  4. tinyxml学习4
  5. UNIX高级环境编程学习
  6. C++实现对树的创建和前中后序遍历
  7. BZOJ 1106 立方体大作战
  8. Python-Day11 RabbitMQ/redis
  9. POJ 1273 (基础最大流) Drainage Ditches
  10. 让进程在后台可靠运行的几种方法 nohup,setsid,&,disown,CTRL-z ,screen
  11. 【原创】08. easyui form控件,回调参数存在后缀 audio controls="controls" style="display: none;"></audio>
  12. random seed()函数
  13. 重新认识AWS
  14. Java流程控制语句
  15. 【转】[Network] 计算机网络基础知识总结
  16. Selenium Web 自动化 - 如何找到元素
  17. Asp.net中GridView使用详解(很全,很经典 转来的)
  18. 电容器的ESR
  19. 适配器模式,装饰模式,代理模式异同<转>
  20. EXCEL导出工具类及调用

热门文章

  1. adminlte+layui框架搭建2 - 动态菜单
  2. Qt 学习之路 2(66):访问网络(2)
  3. Android 使用URL访问网络资源
  4. springmvc相关配置和用法
  5. 洛谷 P3182 [HAOI2016]放棋子(错排问题)
  6. 关于 Gojs 你可能用到的方法 / gojs自定义 / gojs
  7. c#和java的深拷贝CloneObject
  8. 1128 N Queens Puzzle (20 分)
  9. vue 在使用v-html绑定的时候,里面的元素不会继承外部的css,解决方案
  10. Hibernate 4 Second Level Caching With EHCache