版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44580977/article/details/96620890
因为有些时候查询数据的频率很高,很耗费数据库资源,所有常常把变动不大且访问率高的数据放在一个缓存容器里,从而缓解数据库压力。
SqlMapConfig.xml配置
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
mapper.xml
<!--开启user支持二级缓存-->
<cache/>
嗯,在二级缓存测试过程中, 我已经照着上面把二级缓存开启了, 可是没有达到从缓存中取出数据 而是两次查询了数据库
测试类
public class SecondLevelCacheTest {
private InputStream in;
private SqlSessionFactory factory;
@Before//用于在测试方法执行之前执行
public void init()throws Exception{
//1.读取配置文件,生成字节输入流
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.获取SqlSessionFactory
factory = new SqlSessionFactoryBuilder().build(in);
}
@After//用于在测试方法执行之后执行
public void destroy()throws Exception{
in.close();
}
/**
* 测试一级缓存
*/
@Test
public void testSecondLevelCache(){
SqlSession sqlSession1 = factory.openSession();
IUserDao dao1 = sqlSession1.getMapper(IUserDao.class);
User user1 = dao1.findById(41);
System.out.println(user1);
//同一个工厂实例创建的不同sqlsession实例
SqlSession sqlSession2 = factory.openSession();
IUserDao dao2 = sqlSession2.getMapper(IUserDao.class);
User user2 = dao2.findById(41);
System.out.println(user2);
sqlSession2.close();
System.out.println(user1 == user2);
//输出false,user1和user2不是同一个对象
}
}
多个sqlsession实例 共享一个mapper 不是嘛?为什么 这里输出的user 不是同一个对象? 有点以为,如果有朋友看见搞明白了,愿告评论告知一下
四处跪求原因终于找到,二级缓存只有当,关闭sqlsession的时候才会存入二级缓存空间
测试代码修改如下,可以更加深入了解二级缓存
//进修改这里
@Test
public void testSecondLevelCache(){
SqlSession sqlSession1 = factory.openSession();
SqlSession sqlSession2 = factory.openSession();
IUserDao dao2 = sqlSession2.getMapper(IUserDao.class);
User user2 = dao2.findById(41);
System.out.println(user2);
sqlSession2.close();
IUserDao dao1 = sqlSession1.getMapper(IUserDao.class);
User user1 = dao1.findById(41);
System.out.println(user1);
System.out.println(user1 == user2);
}