재판 : HTTPS : //blog.kuangstudy.com/index.php/archives/508/
A. 캐시
1. 소개
-
캐시 [캐시]은 무엇인가?
-
메모리에 임시 데이터가있다.
-
사용자는 종종 캐시 (메모리)에 데이터를 쿼리, 사용자는 캐시에서 쿼리, 쿼리 효율성을 향상 고성능 동시 시스템의 문제를 해결하기 위해 디스크 쿼리에서 쿼리 데이터 (관계형 데이터베이스의 데이터 파일) 할 필요가 없습니다 .
-
-
왜 캐시를 사용할 수 있습니까?
-
, 상호 작용 및 데이터베이스의 수를 줄이 오버 헤드 시스템을 줄이고 시스템 효율을 향상시킬 수 있습니다.
-
-
어떤 데이터를 어떤 캐시를 사용할 수 있습니까?
-
종종 쿼리 및 자주 데이터를 변경
-
2.Mybatis 캐시
-
MyBatis로 아주 쉽게 사용자 정의하고 캐시를 구성 할 수있는 강력한 쿼리 캐싱 기능이 포함되어있다. 캐싱은 크게 쿼리의 효율성을 향상시킬 수 있습니다.
-
기본이 캐시에 의해 정의의 MyBatis 시스템 : 캐시 및 보조 캐시
-
기본적으로 첫 번째 레벨 캐시가 설정되어 있습니다. (SQLSESSION 레벨 캐시, 또한 로컬 캐시라고도 함)
-
수동으로 개방 및 보조 캐시 구성에 대한 필요성은, 그는 네임 스페이스 레벨 캐시를 기반으로합니다.
-
확장 성을 개선하기 위해, MyBatis로는 캐시 인터페이스 캐시를 정의합니다. 우리는 캐시를 구현하여 보조 캐시에 대한 인터페이스를 사용자 정의 할 수 있습니다
-
3. 캐시
-
또한 캐시 로컬 캐시로 알려진 :
-
세션 데이터 중 동일한 데이터베이스 쿼리에서 로컬 캐시에 저장됩니다.
-
나중에, 같은 데이터를 얻을 캐시에서 직접 수행해야하는 경우 데이터베이스를 쿼리로 이동하지 않아야합니다;
-
(1) 프로젝트 mybatis_cache을 구축
UserMapper.java 인터페이스 :
1 // 쿼리에 대한 ID 사용자 2 사용자 queryById (@Param ( "ID") INT의 ID);
UserMapper.xml :
1 <SELECT ID = "queryById"parameterType = "_ INT"resultType = "사용자"> 2 mybatis.user에서 선택 * 여기서, ID = # {ID}; 3 </ 선택>
테스트 코드 :
1 @Test 2 공개 공극 queryByIdTest () { 3 SQLSESSION 세션 = MybatisUtils.getSession (); 4 5 UserMapper session.getMapper = 매퍼 (UserMapper. 클래스 ); (6) (7) 사용자가 사용자 mapper.queryById (= 1 ); 8 에서 System.out.println (사용자); 9 10 에서 System.out.println ( "=====================" ); (11) (12) 사용자 USER2 = mapper.queryById (1 ); 13 에서 System.out.println (USER2); 14 15 은 Session.close (); 16 }
로그 출력을보기 :
로그 분석 :
-
으로 만 쿼리 한 번 로그에서 볼 수있는, 두 번째 쿼리 캐시를 사용하여
(2) 캐시 미스의 경우 (4 건)
-
쿼리는 다른 것들
-
원본 데이터를 변경할 수 있습니다 CRUD 작업, 캐시를 새로 고칠 수밖에 없다!
-
쿼리 다른 Mapper.xml
-
수동으로 캐시를 지우!
1 @Test 2 공개 공극 testQueryUserById () { 3 SQLSESSION 세션 = MybatisUtils.getSession (); 4 UserMapper session.getMapper = 매퍼 (UserMapper. 클래스 ); 5 (6) 사용자가 사용자 mapper.queryUserById (= 1 ); 7 에서 System.out.println (사용자); 8 9 session.clearCache (); //手动清除缓存 10 11 사용 USER2 = mapper.queryUserById (1 ); 12 에서 System.out.println (USER2); (13) 14 에서 System.out.println (사용자 == USER2); (15) (16) () session.close; 17 }
(3) 요약
-
캐시는 기본적으로 활성화에만 유효 SQLSESSION (한 번 SQLSESSION MybatisUtils.getSession 세션 = (); 은 Session.close (); 유효 범위)
4. 보조 캐시
-
글로벌 캐시로 알려진 차 캐시는 캐시 범위는 너무 낮 second-level 캐시의 탄생 그래서
-
보조 캐시에 해당하는 기반 네임 스페이스 레벨 캐시, 이름 공간;
-
작동 메커니즘
-
세션 쿼리 데이터는이 데이터는 현재 세션에서 캐시에 저장됩니다;
-
현재 세션이 종료 된 경우, 해당 세션 캐시는 사라이며, 우리는되어 원하는 세션을 감 으면, 데이터가 보조 캐시에 캐시에 저장됩니다 ;
-
새로운 세션 쿼리 정보, 당신은 보조 캐시의 내용을 얻을 수 있습니다;
-
캐시 (지도)에 대응 자신의 고립 된 데이터에 대한 다른 매퍼 의지하고,
-
1 단계 :
-
열기 글로벌 캐시 [MyBatis로-config.xml에]
<이름 = 설정 값 = "참"/ "cacheEnabled">
-
사용 : 사용 된 각 mapper.xml 보조 캐시 구성이 구성은 매우 간단] [xxxMapper.xml
<캐시 축출 = "FIFO"flushInterval = "60000"사이즈 = "512"readOnly 인 = "참"/>
或<캐시 />
(2) 결과를 사용하여 보조 캐시
(3) 문제 :
-
우리는 직접 사용하는 경우 <캐시 /> 그렇지 않으면 구성 매개 변수를 제공 할 수있다 시리얼 인터페이스 개체를 구현 할 필요없이
-
所有的实体类先实现序列化接口 implements Serializable
1 import lombok.AllArgsConstructor; 2 import lombok.Data; 3 import lombok.NoArgsConstructor; 4 5 import java.io.Serializable; 6 7 @Data 8 @AllArgsConstructor 9 @NoArgsConstructor 10 public class User implements Serializable { 11 private int id; 12 private String name; 13 private String pwd; 14 15 }
(4)小结:
-
只要开启了二级缓存,我们在同一个Mapper中的查询,可以在二级缓存中拿到数据
-
查出的数据都会被默认先放在一级缓存中
-
只有会话提交或者关闭以后,一级缓存中的数据才会转到二级缓存中
5.Mybatis缓存原理
查询顺序:二级缓存-->一级缓存-->数据库
6.自定义缓存Ehcache
(1)介绍:
-
Ehcache是一种广泛使用的java分布式缓存,用于通用缓存;
(2)使用:
-
要在应用程序中使用Ehcache,需要引入依赖的jar包
1 <!-- https://mvnrepository.com/artifact/org.mybatis.caches/mybatis-ehcache --> 2 <dependency> 3 <groupId>org.mybatis.caches</groupId> 4 <artifactId>mybatis-ehcache</artifactId> 5 <version>1.1.0</version> 6 </dependency>
-
在mapper.xml中使用对应的缓存即可:
1 <cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>
-
编写ehcache的配置文件ehcache.xml:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" 4 updateCheck="false"> 5 <!-- 6 diskStore:为缓存路径,ehcache分为内存和磁盘两级,此属性定义磁盘的缓存位置。参数解释如下: 7 user.home – 用户主目录 8 user.dir – 用户当前工作目录 9 java.io.tmpdir – 默认临时文件路径 10 --> 11 <diskStore path="./tmpdir/Tmp_EhCache"/> 12 13 <defaultCache 14 eternal="false" 15 maxElementsInMemory="10000" 16 overflowToDisk="false" 17 diskPersistent="false" 18 timeToIdleSeconds="1800" 19 timeToLiveSeconds="259200" 20 memoryStoreEvictionPolicy="LRU"/> 21 22 <cache 23 name="cloud_user" 24 eternal="false" 25 maxElementsInMemory="5000" 26 overflowToDisk="false" 27 diskPersistent="false" 28 timeToIdleSeconds="1800" 29 timeToLiveSeconds="1800" 30 memoryStoreEvictionPolicy="LRU"/> 31 <!-- 32 defaultCache:默认缓存策略,当ehcache找不到定义的缓存时,则使用这个缓存策略。只能定义一个。 33 --> 34 <!-- 35 name:缓存名称。 36 maxElementsInMemory:缓存最大数目 37 maxElementsOnDisk:硬盘最大缓存个数。 38 eternal:对象是否永久有效,一但设置了,timeout将不起作用。 39 overflowToDisk:是否保存到磁盘,当系统当机时 40 timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。 41 timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。 42 diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false. 43 diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。 44 diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。 45 memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。 46 clearOnFlush:内存数量最大时是否清除。 47 memoryStoreEvictionPolicy:可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)。 48 FIFO,first in first out,这个是大家最熟的,先进先出。 49 LFU, Less Frequently Used,就是上面例子中使用的策略,直白一点就是讲一直以来最少被使用的。如上面所讲,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。 50 LRU,Least Recently Used,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。 51 --> 52 53 </ehcache>