概述
目录
- 一、延迟加载
- 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 空指针异常问题
设置完延迟加载后,进行测试,输出关联实体数据时出现空指针异常,即关联实体无数据;
但是取消延迟加载后又能获取到数据。
有两种可能:
- Mybatis版本过低,Mybatis-3.4.6.jar包换成最新的Mybatis-3.5.1.jar;
(转载自https://blog.csdn.net/PC_ojbk/article/details/90176885) - 当前实体中的关联实体属性无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之延迟加载与缓存机制一、延迟加载二、缓存机制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复