zoukankan      html  css  js  c++  java
  • MyBatis如何禁用掉一级缓存

    一级缓存:同一个sqlsession里面存在,缓存用map存储。

          key:sqlsession.hashcode+statementId+sql value:查询出来的对象。

    二级缓存:不同sqlsession之间共享查询结果集。

    1、  在配置文件SqlMapConfig.xml中加入以下内容(开启二级缓存总开关):cacheEnabled设置为 true

    2、   每个mapper里面的每个sql可以配置useCache 来开启和关闭二级缓存。

    在做一个实时支付项目时遇到一个一级缓存导致的重复记账的问题。

    业务场景:业务系统+第三方支付系统。业务系统记账,向第三方发送支付请求,第三方支付异步返回支付结果。

    在一段时间内,第三方支付将同一个单号,重复告知业务系统支付成功,按理来说同一个单号只需通知一次,

    但是第三方支付抽风了,老是重复告知。

    当然就算第三方支付系统重复告知业务系统,业务系统也有校验的。但是问题就是没有校验住。

    支付里面有一段如下的代码,在同一个方法内,该方法带事务的。

    1。根据ID查询单据详细信息。调用方法A

    2。一些逻辑处理

    3。分布式应用下利用:select  for  update 对某个主体进行加锁。(中间会等待锁)

    4。加锁之后,再根据同一个ID进行查询单据。调用方法A(此处重复查询是为了避免 单据状态已经改变了)

    此时查看log日志,方法A虽然被调用了两次,但是日志只打印了一次。此时确认了是一级缓存导致的,同一个事务 同一个session,同一个sql.

     为了使这个sql的失效,加了一个随机串到SQL里面。

    两次查询分别用 (int)Math.random()*1000  (int)Math.random()*10000 

    where #{randomString}=#{randomString}

    ——转载自:https://blog.csdn.net/xiaoguigui520/article/details/82590395

  • 相关阅读:
    HDU 1402 A * B Problem Plus (FFT)
    CodeForces 935E Fafa and Ancient Mathematics (树形DP)
    HDU 5355 Cake (构造 + 暴力)
    HDU 5360 Hiking (贪心)
    Java高阶回调,回调函数的另一种玩法
    关于git 指令
    Retrofit2 完全解析 探索与okhttp之间的关系
    HTTP中GET与POST的区别
    TCP,IP,HTTP,SOCKET区别和联系
    android 实现类似qq未读消息点击循环显示
  • 原文地址:https://www.cnblogs.com/scorates/p/11185381.html
Copyright © 2011-2022 走看看