• 技术文章 >数据库 >MongoDB

    mongodb 更新失败

     Ly Ly2020-06-08 17:06:43原创2822

    现象:

    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);
                            }
                        }
                    });

    如此失败率,大大减少。

    专题推荐:mongodb
    品易云
    上一篇:mongodb 安装怎么好久 下一篇:mongodb 启动与连接失败

    相关文章推荐

    • mac环境中mongodb启动失败• linux下MongoDB的使用教程• mongodb php.ini 在哪?• mongodb 安装怎么好久

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网