美文网首页
常见小问题

常见小问题

作者: 灿烂的GL | 来源:发表于2023-08-31 15:28 被阅读0次

一、on duplicate key update
(1)on duplicate key update 语句根据主键id或唯一键来判断当前插入是否已存在。
(2)记录已存在时,只会更新on duplicate key update之后指定的字段。
(3)如果同时传递了主键和唯一键,以主键为判断存在依据,唯一键字段内容可以被修改。


二、递归循环栈溢出
场景:重试
问题代码

@Async
    public ConfigInfoDO getVersion(Integer configNum,Integer size) {
        ConfigInfoDO configInfoDO = configMapper.selectConfigInfo();
        ConfigInfoDO newConfigInfoDo = new ConfigInfoDO();

        newConfigInfoDo.setId(configInfoDO.getId());
        switch (configNum) {
            case 1:
                newConfigInfoDo.setVersion(configInfoDO.getVersion());
                break;
            default:
                log.warn("不存在,请先添加");
        }
        try {
            configMapper.updateConfig(newConfigInfoDo,size);
        } catch (RuntimeException e) {
                return getVersion(configNum,size);
        }
        return newConfigInfoDo;
    }

解决方案:
1.把递归调用函数改用while或者for循环来实现 。
2.通过尾递归优化。
3.改用堆内存,函数里定义很大的局部变量(例如大数组),这种情况可以将局部变量改为静态变量(实质上也是全局变量)。
4.增大栈的大小值。
这里采用方法1 ,修改后代码如下

     public ConfigInfoDO test(Integer configNum,Integer size, String deviceMac) {
        Integer tryCount = 10;
        while (tryCount-- > 0) {
            ConfigInfoDO configInfoDO = getVersion(configNum, size, deviceMac);
            if (configInfoDO != null) {
                return configInfoDO;
            }
        }
        log.error("获取连续失败{}次,返回null");
        return null;
    }
@Async
    public ConfigInfoDO getVersion(Integer configNum,Integer size) {
        ConfigInfoDO configInfoDO = configMapper.selectConfigInfo();
        ConfigInfoDO newConfigInfoDo = new ConfigInfoDO();

        newConfigInfoDo.setId(configInfoDO.getId());
        switch (configNum) {
            case 1:
                newConfigInfoDo.setVersion(configInfoDO.getVersion());
                break;
            default:
                log.warn("不存在,请先添加");
        }
        try {
            configMapper.updateConfig(newConfigInfoDo,size);
        } catch (RuntimeException e) {
                return null;
        }
        return newConfigInfoDo;
    }

三、异步结果返回
场景:前端调接口先返回结果,在执行后台逻辑

   @Resource
    public ThreadPoolTaskExecutor taskExecutor;
    
    @Override
    public void update() {
      taskExecutor.execute(() -> {
      你的逻辑代码
      })
    }

四、调第三方接口,requestBody为JsonArray

List<LinkDTO> factoryList = new ArrayList<>();
JSONArray jsonArray = JSONArray.parseArray(JSON.toJSONString(factoryList));
JSONObject data = new JSONObject();
data.put("factoryList", jsonArray);

相关文章

  • 常见小问题

    1.几个img标签放在一起的时候,有些浏览器会有默认的间距,加了通配符也不起作用 使用float属性为img布局(...

  • 常见小问题

    textView控制字数输入: 真机运行报错 解决办法:Xcode-preference-Accounts-找到相...

  • 常见小问题

    1.我想在字典里插入一个整数,但是一直失败。NSInteger类型的变量不允许写进字典里,只能用NSString转...

  • 常见小问题

    使用npm成功安装命令后,执行时却报找不到命令的问题 如何使用node进行广播 2019.03.09这两天学习微信...

  • js常见小问题

    在循环中 加事件不能使用i 使用i的话会自动变成 最大的循环数 用索引 index 在script的里给需要的加上...

  • iOS 常见小问题

    1.button 只有设置成为.system 才能设置normal和selected 2.字符串中转义字符 \ ...

  • 小程序 - 常见小问题

    目录 跳转 wx.navigateTo不能跳转TabBar 常见问题 跳转 wx.navigateTo不能跳转Ta...

  • HTML常见小问题2

    line-height有什么作用? line-height 属性设置行间的距离(行高)。常用的值有:normal ...

  • HTML常见小问题1

    有序列表、无序列表、自定义列表如何使用?写个简单的例子。三者在语义上有什么区别?使用场景是什么? 能否嵌套? 有序...

  • 代码常见小问题总结

    代码常见小问题总结 涉及资金时的防刷、限量、防重(28)长链路防重:一个接口涉及到多个支付接口;根据统一的商户订单...

网友评论

      本文标题:常见小问题

      本文链接:https://www.haomeiwen.com/subject/cxhzmdtx.html