Cache MyBatis-13-

13, caching (to understand)

13.1 Introduction

查询  :       连接数据库,耗资源!
        一次查询的结果,给他暂存在一个可以直接取到的地方!--->内存 :   缓存
        
我们再次查询相同数据的时候,直接走缓存,就不用走数据库了
  1. What cache [Cache]?

    • There is a temporary data in memory.

    • Users often query the data in the cache (memory), users do not need to query data (relational database data files) query from the disk,

      Queries from the cache to improve query efficiency, solve the problem of high-performance concurrent systems.

  2. Why use the cache?

    • Reduce the number of interactions and databases, reduce system overhead and increase system efficiency.
  3. What kind of data can use the cache?

    • Often query and infrequently changing data.

13.2, Mybatis cache

  • MyBatis has includes a powerful query caching feature which can very easily customize and configure the cache. Caching can greatly improve query efficiency.
  • MyBatis system defined by default two cache: a cache and secondary cache
    • By default, only the first-level cache is turned on. (SqlSession level cache, also known as a local cache)
    • The need to manually open and secondary cache configuration, he is based namespace level cache.
    • In order to improve scalability, MyBatis defines the cache interface Cache. We can customize the interface to the secondary cache by implementing Cache

13.3、

  • Also known as a cache local cache: SqlSession
    • During a database query and synonyms session data will be placed in the local cache.
    • If you later need to obtain the same data, take directly from the cache, no need to query data;

Test Procedure:

  1. Open log!
  2. Test queries the same record twice in a Session
  3. View log output

Cache invalidation cases:

  1. Query different things

  2. CRUD operations, may change the original data, it is bound to refresh the cache!

  3. Query different Mapper.xml

  4. Manually clear the cache!

    sqlsession.clearCache(); //手动清理缓存

Topic: cache is enabled by default, only one SqlSession effective, that is, to get connected to close the connection this range segment!

Level cache is a Map.

13.4, second-level cache

  • Secondary cache, also known as global cache, cache scope is too low, so the birth of the second-level cache
  • Based namespace level cache, a name space, corresponding to a secondary cache;
  • Working Mechanism
    • A session query a data, this data will be placed in a cache in the current session;
    • If the current session is closed, the corresponding session cache is gone; we want is, the session closed, the data in the cache is saved in the secondary cache;
    • New session query information, you can get content from secondary cache;
    • Different mapper will on their own isolated data corresponding cache (Map); and

step:

  1. Open global cache

    <!--显式的开启全局缓存-->
    <setting name="cacheEnabled" value="true"/>
  2. Mapper turned on to be used in the secondary cache

    <!--在当前Mapper.xml中使用二级缓存-->
    <cache/>
    也可以自定义参数
    <cache eviction="FIFO"
           flushInterval="60000"
           size="512"
           readOnly="true"/>
  3. test

    1. Question: We need to serialize the entity class! Otherwise it will error

       java.io.NotSerializableException: com.rui.pojo.User

summary:

  • Turning on the second-level cache, at the same Mapper is effectively
  • All data will first be placed in a cache;
  • Only when the session is submitted or closed, will be submitted to the secondary cache!

13.5, Cache principle

13.6, custom cache -encache

EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。

To use ehcache in the program, first guide package!

<!-- https://mvnrepository.com/artifact/org.mybatis.caches/mybatis-ehcache -->
<dependency>
    <groupId>org.mybatis.caches</groupId>
    <artifactId>mybatis-ehcache</artifactId>
    <version>1.1.0</version>
</dependency>

And then specify ehcache cache implementation in the mapper

<!--在当前Mapper.xml中使用二级缓存-->
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

Import Profiles ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
         updateCheck="false">
    <!--
       diskStore:为缓存路径,ehcache分为内存和磁盘两级,此属性定义磁盘的缓存位置。参数解释如下:
       user.home – 用户主目录
       user.dir  – 用户当前工作目录
       java.io.tmpdir – 默认临时文件路径
     -->
    <diskStore path="java.io.tmpdir/Tmp_EhCache"/>
    <!--
       defaultCache:默认缓存策略,当ehcache找不到定义的缓存时,则使用这个缓存策略。只能定义一个。
     -->
    <!--
      name:缓存名称。
      maxElementsInMemory:缓存最大数目
      maxElementsOnDisk:硬盘最大缓存个数。
      eternal:对象是否永久有效,一但设置了,timeout将不起作用。
      overflowToDisk:是否保存到磁盘,当系统当机时
      timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
      timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
      diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
      diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
      diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
      memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
      clearOnFlush:内存数量最大时是否清除。
      memoryStoreEvictionPolicy:可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)。
      FIFO,first in first out,这个是大家最熟的,先进先出。
      LFU, Less Frequently Used,就是上面例子中使用的策略,直白一点就是讲一直以来最少被使用的。如上面所讲,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。
      LRU,Least Recently Used,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
   -->
    <defaultCache
            eternal="false"
            maxElementsInMemory="10000"
            overflowToDisk="false"
            diskPersistent="false"
            timeToIdleSeconds="1800"
            timeToLiveSeconds="259200"
            memoryStoreEvictionPolicy="LRU"/>
 
    <cache
            name="cloud_user"
            eternal="false"
            maxElementsInMemory="5000"
            overflowToDisk="false"
            diskPersistent="false"
            timeToIdleSeconds="1800"
            timeToLiveSeconds="1800"
            memoryStoreEvictionPolicy="LRU"/>
 
</ehcache>

Guess you like

Origin www.cnblogs.com/MrKeen/p/12012116.html