Mybatis的缓存机制引发的问题

项目积累 同时被 2 个专栏收录
48 篇文章 0 订阅
4 篇文章 0 订阅

Mybatis的缓存机制引发的问题

前言

     最近在参与一个图像识别的项目,遇到了一个奇怪的Bug,反复调试后才找到问题来自Mybatis的缓存,下面和大家一起来看看这段代码及处理方案。

代码说明

     下面的代码是主要逻辑是通过aiQueueService这个类查询是否有未识别的数据(status:0),没有就结束循环,如果有就将数据更新为已识别(status:1)。

        while (flag) {
            log.info("循环获取queue数据...");
            queue = aiQueueService.getOne(new QueryWrapper<AiQueue>()
                    .eq("status",0)
                    .last("limit 1"));
            if (queue == null) {
                queueFlag = false;
                DATASTATUS = false;
                log.info("系统无可识别数据");
                break;
            }
            queueFlag = aiQueueService.update(new UpdateWrapper<AiQueue>()
                    .eq("id", queue.getId())
                    .eq("time_stamp", queue.getTimeStamp())
                    .set("status", 1)
                    .set("time_Stamp", System.currentTimeMillis())
                    .set("update_time", LocalDateTime.now()));
            flag = !queueFlag;
        }

     为了不浪费时间精简了代码,很容易看出如果现在表单中有10条未识别的数据将会在While循环中被更新成已识别,但是当每次调用aiQueueService.getOne方法查询间隔较短时将会触发Mybatis的缓存机制(短时间内容多次查询条件相同),不再从数据表中查询直接从缓存中获取结果,将使得代码持续的循环下去。

解决方案

     在指定的查询方法上添加useCache=“false”, flushCache=“true”,可以让每次的查询不读缓存从表单进行查询。

    <select id="getOne" resultMap="BaseResultMap" useCache="false" flushCache="true">
        select * from ai_queue 
    </select>

小结

      代码设计时没有考虑到的问题,带来这样一个Bug也让我重新意识到了Sql查询时缓存所提供的帮助,荣幸与您分享~

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值