zoukankan      html  css  js  c++  java
  • mybatis一级缓存导致sql查询出现问题

    如下代码:

    PubPsndoc pubdoc = pubPsndocDAOService.selectByPrimaryKey(in.id);
    
    pubdoc.setPkCorp(newpkcorp);
    
    pubdoc.setPkDept(newpkdept);
    
    pubPsndocDAOService.update(pubdoc);
    PubPsndoc personPubdoc = pubPsndocDAOService.selectByPrimaryKey(in.id);

    在上述代码中会产生一个问题,就是在第二次sql查询时,查出来的得到的personPubdoc中的值是和修改后的pubdoc是相同的,和数据库中的数据不同。

    之所以产生这个问题是因为mybatis的一级缓存将的查询结果放置在缓存之中,当对查询值进行更改时,相当于修改了缓存当中的值。在第二次查询时,是查询条件也是相同的同一条sql。mybaits便默认从缓存中将值取出,而并未去执行sql语句去数据库中查询。这就导致了personPubdoc中的pkcorp值为newpkcorp、pkdept的值为newpkdept。

    要想规避这个问题我们有两种方法:

    第一种:我们在sql的查询条件中增加一个时间戳的条件,时间戳精确到毫秒可以保证每一条sql的查询条件都不是相同的。这样mybatis便不会从缓存中直接取值。

    第二种:我们可以不对第一次查询到的值做直接修改。

    PubPsndoc pubdoc = pubPsndocDAOService.selectByPrimaryKey(in.id);
    
    try{
        CommonUtil.bean2bean(pubdoc, pubdocChange);
    }catch(Exception e){
       ....
    }
    PubPsndoc pubdocChange;
    pubdocChange.setPkCorp(newpkcorp);
    
    pubdocChange.setPkDept(newpkdept);
    
    pubPsndocDAOService.update(pubdocChange);
    
    PubPsndoc personPubdoc = pubPsndocDAOService.selectByPrimaryKey(in.id);

    我们一定要用CommonUtil.bean2bean()这个方法来进行反射获取属性值得到一个新的类,若是直接等于,类的地址未变还是会修改缓存中的值。

  • 相关阅读:
    angular学习(五)-- Module
    angular学习(四)-- Controller
    angular学习(三)-- $scope
    angular学习(二)-- Directive
    实用css小技巧
    Windows下WebStorm使用SVN(转)
    接口和转码,禁止百度转码
    RGB网页颜色在线取色器
    Java操作Excel文件导入
    设置某指定gridcolumn不可排序:
  • 原文地址:https://www.cnblogs.com/Concerning/p/10298565.html
Copyright © 2011-2022 走看看