MongoDB(online) 優化

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;
    }
  • 簡單闡述java

    1. 查看此方法的引用,基本是作判斷使用,不必返回一個Cursor
    2. 若是引用的方法,有長任務,而後再操做,就會等待很長時間不釋放資源
  • 建議修改mongodb

     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);
    ......
  • 簡單闡述app

    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
  • 建議修改spa

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. 其它項目也能夠參考,或者拋出來
相關文章
相關標籤/搜索