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

  • 相关阅读:
    POJ 1681 Painter's Problem(高斯消元法)
    HDU 3530 Subsequence(单调队列)
    HDU 4302 Holedox Eating(优先队列或者线段树)
    POJ 2947 Widget Factory(高斯消元法,解模线性方程组)
    HDU 3635 Dragon Balls(并查集)
    HDU 4301 Divide Chocolate(找规律,DP)
    POJ 1753 Flip Game(高斯消元)
    POJ 3185 The Water Bowls(高斯消元)
    克琳:http://liyu.eu5.org
    WinDbg使用
  • 原文地址:https://www.cnblogs.com/Concerning/p/10298565.html
Copyright © 2011-2022 走看看