【笔记】MyBatis缓存

前言

MyBatis缓存

一级缓存

  • 一级缓存默认开启
  • 使用同一个SqlSession进行SQL语句的查询,只会查询一次
1
2
3
4
5
6
7
8
@Test
public void testFirstLevelCache() {
SqlSession session = ssf.openSession();
String statement = "com.cy.pj.sys.dao.SysMenuDao.findObjects";
session.selectList(statement);
session.selectList(statement);
session.close();
}

二级缓存

  • 使用不同的SqlSession进行SQL语句的查询,会查询两次
  • 二级缓存默认开启,但需要配置。需要在Mapper里写<cache/>标签,在代码中使用commit()进行提交。此时只会查询一次
1
2
3
<mapper namespace="">
<cache/>
</mapper>
1
2
3
4
5
6
7
8
9
10
11
@Test
public void testSecondLevelCache() {
SqlSession session1 = ssf.openSession();
SqlSession session2 = ssf.openSession();
String statement = "com.cy.pj.sys.dao.SysMenuDao.findObjects";
session1.selectList(statement);
session1.commit();
session2.selectList(statement);
session1.close();
session2.close();
}

更多配置

eviction:缓存策略
flushInterval:每隔指定毫秒值刷新
size:最多可以存储结果对象或列表的引用个数
readyOnle:是否只读

false:默认值。多个线程使用反序列化实现缓存,会产生两个对象
true:多个线程使用相同对象地址实现缓存,会产生一个对象

1
2
3
4
5
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>

完成