• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

mongodb 更新失败

mysql 搞java代码 3年前 (2022-05-13) 13次浏览 已收录 0个评论

现象:

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

www#gaodaima.com来源[email protected]搞@^&代*@码网搞代码

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

如此失败率,大大减少。

来源:搞代码网:原文地址:https://www.gaodaima.com


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:mongodb 更新失败

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址