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

  • 相关阅读:
    kali linux源大全
    kali2016.2(debian)快速安装mysql5.7.17
    hadoop java上传文件
    HDFS客户端的权限错误:Permission denied
    hadoop fs命令
    解决Unable to load native-hadoop library for your platform
    并查集。路径压缩 算法运用学习(一)
    HBase快速安装
    记一次zookeeper单机伪集群分布
    ZooKeeper使用命令大全
  • 原文地址:https://www.cnblogs.com/scorates/p/11185381.html
Copyright © 2011-2022 走看看