我是靠谱客的博主 尊敬棒球,最近开发中收集的这篇文章主要介绍Mybatis之延迟加载与缓存机制一、延迟加载二、缓存机制,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

  • 一、延迟加载
    • 1.1 概述
    • 1.2 导入jar包:
    • 1.3 全局配置
    • 1.4 局部配置
    • 1.5 空指针异常问题
  • 二、缓存机制
    • 2.1 缓存概述
    • 2.2 一级缓存
    • 2.3 二级缓存
    • 2.4 配置ehcache

一、延迟加载

1.1 概述

延迟加载也称为“按需加载”。

在执行关联查询时候,只有实际用到关联实体时,才会把关联实体查询出来。因此,延迟加载可以减少不必要的关联查询,提高数据库的查询效率。

MyBatis默认并没有启用延迟加载策略。如果要启用延迟加载策略,需要我们手动进行配置。

1.2 导入jar包:

asm-7.0.jar

cglib-3.2.10.jar

1.3 全局配置

在mybatis-config.xml配置文件中配置启用全局延迟加载策略。如果启用了全局延迟加载,那么查询实体时候,关联实体并不会马上加载出来。

<settings>
    <setting name="lazyLoadingEnabled" value="true" />
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>

1.4 局部配置

局部配置延迟加载就是在collection节点中指定fetchType属性。该属性的值:

lazy:延迟加载

eager:立即加载

<collection property="students" column="id" ofType="studentAlia"
			select="com.chinasofti.mapper.StudentMapper.findStudentByCourseId"
			fetchType="eager"/>

如果使用注解,则在映射关系中使用fetchType

many=@Many(
select = "com.chinasofti.mapper.StudentMapper.findStudentByCourseId",
fetchType = FetchType.LAZY)

一般来说,我们会在全局中配置延迟加载。如果某些关联实体不需要延迟加载,那么就在collection节点中指定fetchType="eager"属性即可。

1.5 空指针异常问题

设置完延迟加载后,进行测试,输出关联实体数据时出现空指针异常,即关联实体无数据;
但是取消延迟加载后又能获取到数据。
在这里插入图片描述
有两种可能:

  1. Mybatis版本过低,Mybatis-3.4.6.jar包换成最新的Mybatis-3.5.1.jar;
    (转载自https://blog.csdn.net/PC_ojbk/article/details/90176885)
  2. 当前实体中的关联实体属性无get或set方法;

二、缓存机制

2.1 缓存概述

使用缓存好处:减轻数据库压力,提高数据库的访问效率。
不带缓存的数据库查询:
在这里插入图片描述
带缓存的数据库查询:
在这里插入图片描述

2.2 一级缓存

一级缓存称为session缓存,同一个session中的数据会保存在Session中。默认情况下,MyBatis已经启用了一级缓存。如果不希望使用缓存,可以在执行查询后掉用以下方法:

session.clearCache();

2.3 二级缓存

二级缓存是文件级别的缓存。但是,如果需要启用二级缓存,需要用户手动进行配置。

执行查询操作时候,mybatis会先从二级缓存中查询数据,如果二级缓存没有,再从一级缓存(session)中查找数据,如果一级缓存也没有,才会查询数据库。

2.4 配置ehcache

第一步:
导入第三方工具包ehcache;

mybatis-ehcache-1.0.3.jar(mybatis-ehcache安装包)
ehcache-core-2.6.8.jar(mybatis-ehcache安装包)
slf4j-api-1.7.26.jar(mybatis安装包)
slf4j-log4j12-1.7.26.jar(mybatis安装包)

下载地址:
第三方工具包ehcache
或者使用maven导入依赖

<!--缓存ehcache机制-->
    <!--mybatis ehcache依赖包-->
    <dependency>
      <groupId>org.mybatis.caches</groupId>
      <artifactId>mybatis-ehcache</artifactId>
      <version>1.0.3</version>
    </dependency>
    <!-- ehcache核心jar包 -->
    <dependency>
      <groupId>net.sf.ehcache</groupId>
      <artifactId>ehcache-core</artifactId>
      <version>2.6.11</version>
    </dependency>
    <!--slf4j-api包-->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.25</version>
    </dependency>
    <!--slf4j-log4j12包-->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.25</version>
    </dependency>
    <!---->

第二步:
在项目的src目录下新建ehcache.xml 文件,该文件是ehcache的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
	<!--缓存目录  -->
	<diskStore path="d:/ehcache" />
	<!--
		属性说明: 
			name: Cache的唯一标识
			maxElementsInMemory: 内存中最大缓存对象数
			maxElementsOnDisk: 磁盘中最大缓存对象数,若是0表示无穷大
			eternal: Element是否永久有效,一但设置了,timeout将不起作用
			overflowToDisk: 当内存中Element数量达到maxElementsInMemory时,Ehcache将会Element写到磁盘中
			timeToIdleSeconds: 设置Element在失效前允许的闲置时间。仅当element不是永久有效时使用
			timeToLiveSeconds: 设置Element在失效前允许存活时间。最大时间介于创建时间和失效时间之间。仅当element不是永久有效时使用
			diskExpiryThreadIntervalSeconds: 磁盘失效线程运行时间间隔,默认是120秒
			memoryStoreEvictionPolicy: 当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU
	 -->
	<defaultCache
		name="defaultCache"
		maxElementsInMemory="1000"
		maxElementsOnDisk="10000000"
		eternal="true"
		overflowToDisk="true"
		timeToIdleSeconds="120"
		timeToLiveSeconds="120"
		diskExpiryThreadIntervalSeconds="120"
		memoryStoreEvictionPolicy="LRU">
	</defaultCache>
</ehcache>

第三步:
在Mapper映射文件配置cache节点

<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

注意:
1)缓存对象必须要实现Serializable接口。
2)当关闭session的时候,mybatis才会把session中的缓存数据保存在缓存文件中。

最后

以上就是尊敬棒球为你收集整理的Mybatis之延迟加载与缓存机制一、延迟加载二、缓存机制的全部内容,希望文章能够帮你解决Mybatis之延迟加载与缓存机制一、延迟加载二、缓存机制所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部