9.Mybatis 캐시

재판 : HTTPS : //blog.kuangstudy.com/index.php/archives/508/

A. 캐시

1. 소개

  1. 캐시 [캐시]은 무엇인가?

    • 메모리에 임시 데이터가있다.

    • 사용자는 종종 캐시 (메모리)에 데이터를 쿼리, 사용자는 캐시에서 쿼리, 쿼리 효율성을 향상 고성능 동시 시스템의 문제를 해결하기 위해 디스크 쿼리에서 쿼리 데이터 (관계형 데이터베이스의 데이터 파일) 할 필요가 없습니다 .

  2. 왜 캐시를 사용할 수 있습니까?

    • , 상호 작용 및 데이터베이스의 수를 줄이 오버 헤드 시스템을 줄이고 시스템 효율을 향상시킬 수 있습니다.

  3. 어떤 데이터를 어떤 캐시를 사용할 수 있습니까?

    • 종종 쿼리 및 자주 데이터를 변경

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 건)

  1. 쿼리는 다른 것들

  2. 원본 데이터를 변경할 수 있습니다 CRUD 작업, 캐시를 새로 고칠 수밖에 없다!

  3. 쿼리 다른 Mapper.xml

  4. 수동으로 캐시를 지우!

    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>

 

추천

출처www.cnblogs.com/zhihaospace/p/12302037.html