Mybaits一级缓存和二级缓存

本文详细介绍了MyBatis的一级缓存和二级缓存工作原理及测试过程,包括一级缓存的SqlSession内部机制,二级缓存的开启配置与测试,以及清空缓存的操作,旨在提升数据库查询效率和系统性能。
摘要由CSDN通过智能技术生成

目录

查询缓存

一级缓存

一级缓存的使用过程:

一级缓存的测试

一级缓存测试结果

 不同的sqlSession进行操作

增删改清空缓存

主动清空缓存

二级缓存

二级缓存的使用过程:

开启二级缓存

1.在SqlMapConfig.xml中开启全局二级缓存。

2.在mybatis的sqlmap中配置(mapper.xml中配置)

 3.在使用的操作中配置(在select标签中配置)

4.在接口的定义上面直接使用@CacheNamespace 并将blocking设置为true,二级缓存就可以使用了

二级缓存的测试

 清空缓存


查询缓存

        MyBaits提供了一级缓存和二级缓存功能,目的是为了减少数据库查询操作,提高系统的应用性能。

        一级缓存是sqlSession的缓存。操作数据库时会创建sqlSession对象,该对象内部有一个数据结构(HashMap)用户存储缓存数据。不同的sqlSession对象都有各自的HashMap,之间不会相互影响。

        二级缓存是Mapper级别的缓存,多个sqlSession操作同一个Mapper中的查询,多个SqlSession可以共用同一个缓存,二级缓存是跨SqlSession的。

        如果缓存中已经有了查询语句所对应的数据,那么就不用再访问数据库了,直接从缓存中取数据就可以了,这样便提高了应用系统的性能。

一级缓存

一级缓存的过程:

         第一次发起查询的时候,先去缓存中找是否有id为2的信息,如果没有则去数据库中查询,将查询到的信息先要保存到一级缓存中。然后将信息传出去。

         第一次发起查询的时候,先去缓存中找是否有id为2的信息,缓存中有第一次查询到的信息,直接将缓存中的信息传出去,此次不会进行访问数据库。

        如果sqlSession进行增删改(无论是否提交),就会清空缓存,这样做是为了保证缓存中的数据和数据库中变化后的数据要保持一致,防止有脏读的情况。

一级缓存的测试

package com.ape.test;

import org.apache.ibatis.session.SqlSession;

import com.ape.bean.Student;
import com.ape.dao.DaoUtil;
import com.ape.mapper.StudentMapper;

public class demo2 {
	public static void main(String[] args) {
		SqlSession sqlSession = DaoUtil.getSqlSession();
		StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
		Student s = mapper.findStudentBySid(1);
		System.out.println(s);
		System.out.println("--------------------------");
		Student s2 = mapper.findStudentBySid(1);
		System.out.println(s2);
		System.out.println(s==s2);
		DaoUtil.closeResource(sqlSession);
		
//      不同的sqlSession进行操作
//		SqlSession sqlSession = DaoUtil.getSqlSession();
//		StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
//		Student s = mapper.findStudentBySid(1);
//		System.out.println(s);
//		System.out.println("--------------------------");
//		SqlSession sqlSession2 = DaoUtil.getSqlSession();
//		StudentMapper mapper2 = sqlSession2.getMapper(StudentMapper.class);
//		Student s2 = mapper2.findStudentBySid(1);
//		System.out.println(s2);
//		System.out.println(s==s2);
//		DaoUtil.closeResource(sqlSession);
		
		//增删改清空缓存
//		SqlSession sqlSession = DaoUtil.getSqlSession();
//		StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
//		Student s = mapper.findStudentBySid(1);
//		System.out.println(s);
//		S
  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis中,一级缓存二级缓存都是用于提高查询效率和性能的技术。它们在处理大量数据时特别有用,可以减少数据库的访问次数,提高系统的响应速度。 1. 一级缓存(Session级缓存): 一级缓存是在单个会话(session)级别上设置的缓存。当一个会话启动时,MyBatis会为该会话创建一个一级缓存。在这个会话期间,MyBatis缓存数据库查询的结果,以便在后续的相同查询中使用,而无需再次访问数据库。这样可以减少数据库的负载,提高查询效率。 一级缓存的特点是仅在当前会话有效,当会话结束或关闭时,缓存将被清除。因此,一级缓存通常用于单个用户或单个应用程序的临时缓存,而不适用于跨多个用户或应用程序的共享缓存。 2. 二级缓存(Mapper级缓存): 二级缓存是在MyBatis的映射文件(Mapper文件)级别设置的缓存。与一级缓存不同,二级缓存是跨多个会话和多个用户的共享缓存。当多个会话同时访问同一个映射文件时,二级缓存可以有效地共享查询结果,减少数据库的负载。 二级缓存的特点是可以在多个会话之间共享,适用于跨多个用户或应用程序的场景。MyBatis提供了多种配置选项来启用和配置二级缓存,例如使用`<cache>`标签在映射文件中启用二级缓存。 需要注意的是,二级缓存的启用需要谨慎使用,因为不当的使用可能会导致数据一致性问题。例如,如果两个会话同时更新同一个记录,可能导致其中一个会话看到的更新结果被另一个会话覆盖。因此,在使用二级缓存时,需要仔细考虑其适用场景和潜在风险。 总结来说,一级缓存二级缓存都是MyBatis中用于提高查询效率和性能的技术,但它们的使用场景和特点有所不同。一级缓存适用于单个会话的临时缓存,而二级缓存适用于跨多个会话和用户的共享缓存。在使用时需要根据实际情况进行选择和配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值