一级缓存:同一个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}

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信