mybatis笔记(十一)——查询缓存

查询缓存

作用:减轻数据压力,提高数据库性能
在这里插入图片描述
分为一级缓存、二级缓存(mybstis默认开启一级缓存,关闭二级缓存)
在这里插入图片描述

一、一级缓存

原理:(中间没有commit操作)
在这里插入图片描述
每次发起查询时,先去缓存中查找是否有相同信息,如果没有,从数据库查询信息;如果有,直接从缓存中获取信息

如果sqlSession去执行commit操作(插入、更新、删除),会清空SqlSession中的一级缓存,避免脏读

1.1 一级缓存设置

mybatis默认支持一级缓存,不需要在配置文件去配置

1.2 一级缓存测试
@Test
	public void testCache1() throws Exception{
		SqlSession sqlSession = sqlSessionFactory.openSession();
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		
		User user1 = userMapper.findUserById(1);
		System.out.println(user1);
		
		//更新(中间有commit操作)
		//user1.setUsername("测试用户22");
		//userMapper.updateUser(user1);
		//执行commit操作去清空缓存
		//sqlSession.commit();
		
		User user2 = userMapper.findUserById(1);
		System.out.println(user2);	
		sqlSession.close();
		
	}

二、二级缓存

原理:(中间没有commit操作)
在这里插入图片描述
每一个namespace的mapper都有一个二缓存区域,两个mapper的namespace如果相同,这两个mapper执行sql查询到数据将存在同一个二级缓存区域中

2.1 开启二级缓存

SqlMapConfig.xml文件:

<setting name="cacheEnabled" value="true"/>

xxxMapper.xml文件:

  <cache />

cache 标签参数说明:

  1. eviction:缓存的回收策略
    LRU(默认) - 最近最少使用,移除最长时间不被使用的对象
    FIFO - 先进先出,按对象进入缓存的顺序来移除它们
    SOFT - 软引用,移除基于垃圾回收器状态和软引用规则的对象
    WEAK - 弱引用,更积极地移除基于垃圾收集器和弱引用规则的对
  2. flushInterval:缓存刷新间隔
    缓存多长时间清空一次,默认不清空,设置一个毫秒值
  3. readOnly:是否只读
    true:只读:认为所有从缓存中获取数据的操作都是只读操作,不会修改数据。 mybatis为了加快获取数据,直接就会将数据在缓存中的引用交给用户 。不安全,速度快
    false:读写(默认):mybatis觉得获取的数据可能会被修改。 mybatis会利用序列化&反序列化的技术克隆一份新的数据给你。安全,速度相对慢
  4. size(默认1024):缓存存放多少个元素
  5. type:指定自定义缓存的全类名(实现Cache接口)
2.2 实现序列化

二级缓存需要查询结果映射的pojo对象实现java.io.Serializable接口实现序列化和反序列化操作,如果存在父类、成员pojo都需要实现序列化接口

	public class Orders implements Serializable{
	}
2.3 二级缓存测试
@Test
	public void testCache2() throws Exception {
		SqlSession sqlSession1 = sqlSessionFactory.openSession();
		SqlSession sqlSession2 = sqlSessionFactory.openSession();
		SqlSession sqlSession3 = sqlSessionFactory.openSession();
		UserMapper userMapper1 = sqlSession1.getMapper(UserMapper.class);
		User user1 = userMapper1.findUserById(1);
		System.out.println(user1);
		
		//这里执行关闭操作,将sqlsession中的数据写到二级缓存区域
		sqlSession1.close();	
		
		//使用sqlSession3执行commit()操作
		UserMapper userMapper3 = sqlSession3.getMapper(UserMapper.class);
		User user  = userMapper3.findUserById(1);
		user.setUsername("张明明");
		userMapper3.updateUser(user);
		//执行提交,清空UserMapper下边的二级缓存
		sqlSession3.commit();
		sqlSession3.close();

		UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);
		User user2 = userMapper2.findUserById(1);
		System.out.println(user2);

		sqlSession2.close();

	}
2.4 属性配置

在statement中:
useCache=false,禁用二级缓存功能,默认为true

<select id="findOrderListResultMap" resultMap="ordersUserMap" useCache="false">

flushCache=false,不会刷新缓存,使用缓存时如果手动修改数据库表中的查询数据会出现脏读。默认为true

<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User" flushCache="true">
2.5 应用场景

访问多的查询请求且对查询结果实时性要求不高的场景;
可通过设置flushInterval来设置缓存刷新间隔,每隔一段时间自动清空缓存
业务场景比如:耗时较高的统计分析sql、电话账单查询sql…

2.6 局限性

对细粒度的数据级别的缓存实现不好:
mybaits的二级缓存区域以mapper为单位划分,当其中一个信息commit操作时会将所有信息的缓存数据清空,无法实现当一个信息变化时只刷新这一个缓存信息而不刷新其它的信息。解决此类问题需要在业务层根据需求对数据有针对性缓存

三、mybatis整合ehcache

ehcache是一个分布式缓存框架

3.1 分布缓存

对缓存数据进行集中管理
在这里插入图片描述

3.2 整合方法(掌握)

mybatis提供了cache接口,要实现自己的缓存逻辑,实现cache接口开发即可

  1. mybatis和ehcache整合包中提供了一个cache接口的实现类
    在这里插入图片描述
  2. mybatis默认实现cache类:
    在这里插入图片描述
3.2.1 加入ehcache包

在这里插入图片描述

3.2.2 配置文件
  1. 配置mapper中cache中的type为ehcache对cache接口的实现类型
	<!-- type:指定cache接口的实现类的类型,mybatis默认使用PerpetualCache
	要和ehcache整合,需要配置type为ehcache实现cache接口的类型
	 -->
	<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

2.新增ehcache.xml配置文件

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
	<diskStore path="F:\develop\ehcache" />
	<defaultCache 
		maxElementsInMemory="1000" 
		maxElementsOnDisk="10000000"
		eternal="false" 
		overflowToDisk="false" 
		timeToIdleSeconds="120"
		timeToLiveSeconds="120" 
		diskExpiryThreadIntervalSeconds="120"
		memoryStoreEvictionPolicy="LRU">
	</defaultCache>
</ehcache>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值