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

 

转载于:https://www.cnblogs.com/Concerning/p/10298565.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值