SSMMybatis配置缓存
Posted Tomas曼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSMMybatis配置缓存相关的知识,希望对你有一定的参考价值。
1.在没有配置的情况下,mybatis默认开启一级缓存。
1 Object object=mapper.getXxx(object); 2 Object object2=mapper.getXxx(object);
打个断点测试一下就知道了。
在同一个SqlSession中,第一次查询后,调用mapper相同方法,SqlSession会从一级缓存中取数据,而且得到的是相同的对象。不会发送SQL。
如果SqlSession进行了提交,那么一级缓存将会清除。
1 public void test(){ 2 SqlSession session = MyBatisUtil.getSession(); 3 IUserDAO mapper = session.getMapper(IUserDAO.class); 4 UserOneToMany user = new UserOneToMany(); 5 user.setUsercode("zhangsan"); 6 UserOneToMany userOneToMany = mapper.getUserOneToManyBills(user); 7 System.out.println("======"+userOneToMany); 8 session.commit(); 9 UserOneToMany userOneToMany2 = mapper.getUserOneToManyBills(user); 10 System.out.println("======"+userOneToMany2); 11 session.close(); 12 }
打印结果不同,且发送了两次SQL,获得了两个不同的对象:
2.MyBatis开启二级缓存第一步:大配置中settings节点加入:<setting name="cacheEnabled" value="true"/>
第二步:命名空间加入节点:<cache/>
这里<cache/>节点可以设置得更详细些,比如:
<cache eviction="LRU" flushInterval="100000" size="1024" readOnly="true"/>
其中eviction代表回收策略(LRU|FIFO|SOFT|WEAK);flushInterval代表刷新间隔时间,单位是毫秒;size是引用数目,就是缓存中可以存放多少个对象;readOnly只读,缓存只能读取不能修改。
简单说明下四个回收策略:
1.LRU(默认):最近最少使用,移除最长时间不用的对象。
2.FIFO:先进先出,按对象进入缓存的顺序移除它们。
3.SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象。
4.WEAK:弱引用,移除基于垃圾回收器状态和弱引用规则的对象。
第三步:相应实体类实现Serializable接口
测试方法不变,观察结果:
首先,程序只发送了一次SQL。其次,第二次取到的数据是从缓存中获得的,同样获取的是两个不同的对象。
以上是关于SSMMybatis配置缓存的主要内容,如果未能解决你的问题,请参考以下文章
Android获取各个应用程序的缓存文件代码小片段(使用AIDL)
Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题