zoukankan      html  css  js  c++  java
  • Mongodb 更新失败解决方案

    现象:

    WriteResult res = mongoTemplate.updateFirst(query, updateObj, "ServerToAgentReq_SMS");

    获取res.getN()返回值时,发现偶尔情况下该返回值为0,表示该更新操作没有更新到任何数据。并且如果是多线程并发更新,失败几率大大提高。

    官网表示不能保证更新操作的成功性....

    方案:

    一次失败后,另起线程多次重试。

     private ThreadPoolExecutor exec = new ThreadPoolExecutor(2, 10, 3, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10), new ThreadPoolExecutor.CallerRunsPolicy());
    
    主要代码: 
    WriteResult res = mongoTemplate.updateFirst(query, updateObj, "ServerToAgentReq_SMS");
                //如果更新失败,进入其他线程重试更新
                if (res.getN() == 0) {
                    exec.execute(new Runnable() {
                        @Override
                        public void run() {
                            int num = 0;
                            WriteResult res = mongoTemplate.updateFirst(query, updateObj, "ServerToAgentReq_SMS");
                            while (res.getN() == 0 && num < 100) {
                                res = mongoTemplate.updateFirst(query, updateObj, "ServerToAgentReq_SMS");
                                num++;
                                try {
                                    Thread.sleep(300);
                                } catch (InterruptedException e) {
                                    logger.error("响应更新失败{}", e);
                                }
                            }
                            if (res.getN() == 0) {
                                logger.error("响应更新失败!!!gwMsgId:{},masMsgId:{}", gwMsgId, masMsgId);
                            }
                        }
                    });

    如此失败率,大大减少。

  • 相关阅读:
    gulp基础
    字符串及字符串的方法
    ES5
    JS的设计模式
    VSN与GitHub
    JS闭包函数的概念及函数的继承
    Promise的工作原理
    JS原生的Ajax
    MySQL数据库的基本操作
    & 异步使用场景
  • 原文地址:https://www.cnblogs.com/zhishan/p/2814274.html
Copyright © 2011-2022 走看看