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()这个方法来进行反射获取属性值得到一个新的类,若是直接等于,类的地址未变还是会修改缓存中的值。

  • 相关阅读:
    简单理解jQuery中$.getJSON、$.get、$.post、$.ajax用法
    适配器模式(Adapter Pattern)
    什么样的登录框才算是优秀的?
    transient的作用及序列化
    MySQL索引实现原理
    concurrentHashMap原理分析和总结(JDK1.8)
    HashMap实现原理(JDK1.8)
    深入理解Java中的IO
    多线程系列
    多线程系列
  • 原文地址:https://www.cnblogs.com/Concerning/p/10298565.html
Copyright © 2011-2022 走看看