1) 一级缓存
每个sqlsession都有一个一级缓存,只要sql语句和参数相同,只有第一次查询数据库,并且会把查询结果放入一级缓存之后的查询,就直接从一级缓存中获取结果。
一级缓存的作用范围,只限于一个sqlsession
@Test
public void test2() {
SqlSession s1 = factory.openSession();
s1.selectOne("com.westos.mapper.ProductMapper.select1", 1);
System.out.println("======================");
s1.selectOne("com.westos.mapper.ProductMapper.select1", 1);
s1.close();
}
2) 二级缓存
所有sqlSession共享的缓存,一级缓存无需配置,而二级缓存需要配置,二级缓存的意义是减少与数据库的交互,从而提升程序的性能(SqlMapConfig.xml修改)
<settingname='cacheEnabled'value='true'/>
<settings>
<!-- 开启二级缓存 默认值为true -->
<settingname='cacheEnabled'value='true'/>
</settings>
@Test
public void test2() {
SqlSession s1 = factory.openSession();
s1.selectOne("com.westos.mapper.ProductMapper.select1", 1);
s1.close();
System.out.println("+++++++++++++++++++++++++++++++++++++");
SqlSession s2 = factory.openSession();
s2.selectOne("com.westos.mapper.ProductMapper.select1", 1);
s2.close();
System.out.println("+++++++++++++++++++++++++++++++++++++");
SqlSession s3 = factory.openSession();
Product product = new Product();
product.setId(1);
product.setName("TCL 55A950C 55英寸32核人工智能 HDR曲面超薄4K电视金属机身(枪色)");
product.setTablename("abc");
product.setPrice(2499.00);
s3.update("com.westos.mapper.ProductMapper.update", product);
s3.commit();
s3.close();
System.out.println("+++++++++++++++++++++++++++++++++++++");
SqlSession s4 = factory.openSession();
s4.selectOne("com.westos.mapper.ProductMapper.select1", 1);
s4.close();
}
3) 缓存失效
只要是执行了增,删,改的操作,缓存就应该失效,仍然从数据库查询得到最新结果
4) 二级缓存适用场景
当数据的查询远远多于修改时, 才有启用二级缓存的必要