MyBatis如何禁用掉一级缓存。
2016-12-15 16:23
127 查看
一级缓存:同一个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}
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}
相关文章推荐
- MyBatis中如何禁用缓存
- 学习如何在 Java 代码中启用和禁用断言
- 如何: 在Windows2000中动态禁用/启用Ctrl-Alt-Delete
- win2000怎么实现自动登录,又如何禁用?(转东转西)
- asp.net 后台禁用checkbox后,如何在前台脚本恢复的解决方法
- 如何禁用注册表
- 如何对 IIS 5.0 禁用 WebDAV
- win2000怎么实现自动登录,又如何禁用?
- windows2003中如何启用默认被禁用的DirectX
- 如何在 Windows XP 和 Windows Server 2003 中禁用客户端 DNS 缓存
- 如何: 在Windows2000中动态禁用/启用Ctrl-Alt-Delete
- 如何禁用端口!(网络摘录)
- 如何再Windows中禁用USB存储设备
- VB:如何启用/禁用本地连接
- 如何在命令行模式下禁用或启用网卡
- 如何禁用Ctrl-C(在键盘上)
- 如何通过WEB方式,来控制iis的禁用IP名单
- 请教如何禁用网卡,Win2K/Win98
- 如何: 在Windows2000中动态禁用/启用Ctrl-Alt-Delete
- 如何在Windows2000中动态禁用/启用Ctrl-Alt-Delete