Mybatis的一级缓存和二级缓存原理分析与使用

网友投稿 792 2022-11-19

Mybatis的一级缓存和二级缓存原理分析与使用

Mybatis的一级缓存和二级缓存原理分析与使用

目录Mybatis的一级缓存和二级缓存1 Mybatis如何判断两次查询是完全相同的查询2 二级缓存2.1 二级缓存配置2.2 二级缓存特点2.3 配置二级缓存2.4 测试

Mybatis的一级缓存和二级缓存

Mybatis会将相同查询条件的SQL语句的查询结果存储在内存或者某种缓存介质中,当下次遇到相同的SQL时不执行该SQL,而是直接从缓存中获取结果,减少服务器的压力,尤其是在查询越多、缓存命中率越高的情况下,使用缓存对性能的提高更明显。

Mybatis缓存分为一级缓存和二级缓存,一级缓存是将结果缓存在SqlSession对象中,二级缓存是存储在SqlSessionFactory对象中。默认情况下,Mybatis开启一级缓存,不开启二级缓存当数据量更大时,可以借助第三方缓存技术协助保存Mybatis的二级缓存数据

如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用 SqlSession中执行了任何一个update操作(update()、delete()、insert()),都会清空PerpetualCache对象的数据,但是该对象可以继续使用

1 Mybatis如何判断两次查询是完全相同的查询

如果以下条件完全一样,Mybatis则认为是相同的查询

-- 传入的statementid。

-- 查询时要求的结果集中的结果范围

-- 这次查询所产生的最终要传递给Preparedstatement的Sql语句字符

-- 传递的参数值

@Test

public void testCacheOne(){

SqlSession sqlSession = MybatisUtil.getSqlSession();

UserDao userDao = sqlSession.getMapper(UserDao.class);

Users users = userDao.selectUsersById(1);

Users users1 = userDao.selectUsersById(1);

System.out.println(users);

System.out.println(users1);

}

查询两次,数据库查询了一次

@Test

public void testCacheOne(){

SqlSession sqlSession = MybatisUtil.getSqlSession();

UserDao userDao = sqlSession.getMapper(UserDao.class);

Users users = userDao.selectUsersById(1);

//清空缓存

sqlSession.clearCache();

Users users1 = userDao.selectUsersById(1);

System.out.println(users);

System.out.println(users1);

}

清空缓存,数据库查询了两次

2 二级缓存

​ Mybatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,二级缓存SqlSessionFactory上缓存,可以是由一个SqlSessionFactory创建的不同的SqlSession之间共享缓存数据。默认不开启。SqlSession在执行commit()或者close()的时候将数据放入到二级缓存

2.1 二级缓存配置

Mybatis实现二级缓存的实体类必须是可序列化的,也就是要求实现Serializable接口。在映射配置文件中配置就可以开启缓存了

2.2 二级缓存特点

映射语句文件中的所有select查询语句都会被缓存

insert、update、delete语句会刷新缓存

二级缓存是以namespace为单位,不同namespace下的操作互不影响

如果在加入标签的前提下让个别select元素不适用缓存,可以使用useCache属性,设置为false

2.3 配置二级缓存

在mybatis-config.xml文件中标签配置开启二级缓存。cacheEnabled的值就是true,可省略

在映射文件中添加

2.4 测试

@Test

publhttp://ic void testCacheTwo(){

SqlSession sqlSession=MybatisUtil.getSqlSession();

UserDao userDao = sqlSession.getMapper(UserDao.class);

Users users =VJrWOlbwk userDao.selectUsersById(1);

System.out.println(users);

//关闭SqlSession后,重新获取SqlSession对象查询

MybatisUtil.closeSqlSession();

SqlSession sqlSession2=MybatisUtil.getSqlSession();

UserDao userDao2 = sqlSession2.getMapper(UserDao.class);

Users users2 = userDao2.selectUsersById(1);

System.out.println(users2);

}

查询了一次,可以看出不同的SqlSession之间共享缓存数据。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Bootstrap按钮组件
下一篇:strncpy函数
相关文章

 发表评论

暂时没有评论,来抢沙发吧~