¿Sabes algo sobre la caché de Mybatis?

Cómo se implementa la caché

  • Caché de nivel 1

  • Caché secundario

Práctica de caso

1. Caché de nivel 1

Caché local de HashMap basado en PerpetualCache (mybatis implementa internamente la interfaz de caché), y su alcance de almacenamiento es Sesión. Después de vaciar o cerrar la Sesión, todos los Cachés en la Sesión serán vaciados;

2. Caché secundario

El mecanismo del caché de primer nivel es el mismo, el predeterminado también es el almacenamiento HashMap de PerpetualCache, la diferencia es que su alcance de almacenamiento es Mapper (espacio de nombres), y la fuente de almacenamiento se puede personalizar, como Ehcache;

Para el mecanismo de actualización de datos de caché, cuando se realiza una operación C / R / U / D en un determinado ámbito (sesión de caché de primer nivel / espacios de nombres de caché de segundo nivel), todas las cachés seleccionadas en este ámbito se borrarán de forma predeterminada.

Si el segundo caché está habilitado, primero consulte los datos del segundo caché, si el segundo caché los tiene, obtenga los datos del segundo caché, si el segundo caché no los tiene, verifique si hay datos de caché del primer caché, si el primer caché no los tiene, consulte Base de datos .

3. Limitaciones de la caché secundaria

La caché de segundo nivel de Mybatis no es buena para el almacenamiento en caché de nivel de datos de grano fino. Para almacenar en caché más datos al mismo tiempo, como los siguientes requisitos: almacenamiento en caché de información de productos, debido a la gran cantidad de visitas a consultas de información de productos, pero los usuarios deben hacerlo siempre Puede consultar la información más reciente del producto. En este momento, si usa la caché secundaria de mybatis, no será posible actualizar solo la información de la caché de este producto y no la información de otros productos cuando cambie un producto, porque el área de caché secundaria de mybaits se basa en el mapeador. Dividir, cuando cambia la información de un producto, todos los datos almacenados en caché de toda la información del producto se borrarán

4. Caché de nivel 1 (habilitado de forma predeterminada)

Mybatis proporciona caché de primer nivel de forma predeterminada, y el alcance de la caché es una sesión sql. En la misma SqlSession, ejecute la misma consulta SQL dos veces y ya no consulte desde la base de datos la segunda vez.

Principio: La caché de primer nivel usa almacenamiento Hashmap, cuando mybatis ejecuta una consulta, consulta desde la caché, si no hay ninguna consulta de la base de datos en la caché. Si SqlSession ejecuta clearCache () confirmar o agregar operación de modificación de eliminación, borre la caché.

Existe de forma predeterminada, solo comprenda el resultado de la observación

a. Existencia de caché (sesión no enviada)

@Test 

public void test01() { 

    SqlSession sqlSession=sqlSessionFactory.openSession();  

    AccountDao accountDao=sqlSession.getMapper(AccountDao.class);  

    Account account=accountDao.queryAccountById(1); 

    System.out.println(account); 

    accountDao.queryAccountById(1);  

} 

El registro solo imprime un sql

¿Sabes algo sobre la caché de Mybatis?

b. Actualizar la caché

Los datos almacenados en caché se actualizan cuando se envía la sesión

@Test 
public void test02() { 
    SqlSession sqlSession=sqlSessionFactory.openSession();  
    AccountDao accountDao=sqlSession.getMapper(AccountDao.class);  
    Account account=accountDao.queryAccountById(1); 
    System.out.println(account); 
    sqlSession.clearCache(); 
    accountDao.queryAccountById(1);  
} 

efecto:

¿Sabes algo sobre la caché de Mybatis?

5. Caché secundario

La caché de primer nivel está en la misma sesión sql, y la caché de segundo nivel está en el mismo espacio de nombres, por lo que diferentes sesiones sql con el mismo espacio de nombres pueden usar la caché de segundo nivel.

escenas que se utilizarán

  • Para datos con alta frecuencia de consulta y baja frecuencia de cambio, se recomienda utilizar la caché secundaria.
  • Para las solicitudes de consulta a las que se accede con frecuencia y los usuarios no tienen altos requisitos de resultados de consultas en tiempo real, la tecnología de caché secundaria mybatis se puede utilizar para reducir el acceso a la base de datos y aumentar la velocidad de acceso. Escenarios comerciales como: SQL de análisis estadístico que consume mucho tiempo, facturas telefónicas Consulta SQL, etc.

Configuración de archivo global (mybatis.xml)

<setting name="cacheEnabled" value="true"/> 
Mapper.xml 中加入 :打开该 mapper 的二级缓存 

<!-- 开启该 mapper 的二级缓存 --> 

<cache/>

Atributos comunes de la etiqueta de caché

<cache  

eviction="FIFO" <!--回收策略为先进先出--> 

flushInterval="60000" <!--自动刷新时间 60s--> 

size="512" <!--最多缓存 512 个引用对象--> 

readOnly="true"/> <!--只读--> 

Descripción:

  1. Todas las sentencias de selección del archivo de sentencias de asignación se almacenarán en caché.
  2. Todas las declaraciones de inserción, actualización y eliminación en el archivo de declaración de asignación actualizarán la caché.
  3. La memoria caché se recuperará mediante el algoritmo de uso menos reciente (LRU).
  4. La caché se actualizará según el intervalo de tiempo especificado.
  5. El caché almacenará 1024 objetos

El objeto PO debe admitir la serialización

public class User implements Serializable { 

} 

Desactive la caché de declaraciones específicas en Mapper

Use useCache: el valor predeterminado es verdadero

<select id="findUserByid" parameterType="int" resultType="User"  

useCache="false"> 

    SELECT * FROM user WHERE id=#{id} 

</select> 

Actualizar la caché secundaria

Al operar la instrucción CUD, la caché de segundo nivel se verá obligada a actualizarse, es decir, el valor predeterminado flushCache = "true". Si desea desactivarlo, configúrelo en flushCache = "false". No se recomienda desactivar la actualización, porque la operación actualización elimina la modificación. datos.

Prueba de caché secundaria:

@Test 

public void test03() { 

    SqlSession sqlSession=sqlSessionFactory.openSession();  

    AccountDao accountDao=sqlSession.getMapper(AccountDao.class);  

    Account account=accountDao.queryAccountById(1); 

    System.out.println(account); 

    sqlSession.close(); 

    SqlSession sqlSession2=sqlSessionFactory.openSession(); 

    AccountDao accountDao2=sqlSession2.getMapper(AccountDao.class);  

    accountDao2.queryAccountById(1); 

    sqlSession.close(); 

} 

efecto:

¿Sabes algo sobre la caché de Mybatis?

Expandir

Caché distribuido ehcache

Si hay varios servidores, no se utiliza la caché distribuida y los datos en caché se almacenan por separado en cada servidor, lo que no es conveniente para el desarrollo del sistema. Por lo tanto, se debe utilizar una caché distribuida para administrar de forma centralizada los datos almacenados en caché. Así que usa ehcache memcached redis

Mybatis por sí mismo no puede lograr el almacenamiento en caché distribuido, por lo que debe integrarse con el marco de almacenamiento en caché distribuido. EhCache es un marco de almacenamiento en caché en proceso de Java puro, que es rápido y capaz; Ehcache es un caché distribuido de Java de código abierto ampliamente utilizado. Principalmente para caché de uso general, Java EE y contenedores ligeros. Tiene características tales como memoria y almacenamiento en disco, cargador de caché, extensión de caché, manejador de excepciones de caché, un filtro de servlet de caché gzip y admite API REST y SOAP.

Dependencia de jar

<dependency> 

    <groupId>net.sf.ehcache</groupId> 

    <artifactId>ehcache-core</artifactId> 

    <version>2.4.4</version> 

</dependency> 

<dependency> 

    <groupId>org.mybatis.caches</groupId> 

    <artifactId>mybatis-ehcache</artifactId> 

    <version>1.0.3</version> 

</dependency> 

Configuración de la interfaz de caché

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

Agregue ehcache.xml en src (no es necesario, no se usa la configuración predeterminada)

<?xml version="1.0" encoding="UTF-8"?> 

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

xsi:noNamespaceSchemaLocation="../bin/ehcache.xsd"> 

<!-- 

name:Cache 的唯一标识 

maxElementsInMemory:内存中最大缓存对象数 

maxElementsOnDisk:磁盘中最大缓存对象数,若是 0 表示无穷大 

eternal:Element 是否永远不过期,如果为 true,则缓存的数据始终有效,如果为 false 

那么还要根据 timeToIdleSeconds,timeToLiveSeconds 判断 

overflowToDisk:配置此属性,当内存中 Element 数量达到 maxElementsInMemory 时, 

Ehcache 将会 Element 写到磁盘中 

timeToIdleSeconds:设置 Element 在失效前的允许闲置时间。仅当 element 不是永久有效 

时使用,可选属性,默认值是 0,也就是可闲置时间无穷大 

timeToLiveSeconds:设置 Element 在失效前允许存活时间。最大时间介于创建时间和失效 

时间之间。仅当 element 不是永久有效时使用,默认是 0.,也就是 element 存活时间无穷 

大 

diskPersistent:是否缓存虚拟机重启期数据 

diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是 120 秒 

diskSpoolBufferSizeMB:这个参数设置 DiskStore(磁盘缓存)的缓存区大小。默认是 

30MB。每个 Cache 都应该有自己的一个缓冲区 

memoryStoreEvictionPolicy:当达到 maxElementsInMemory 限制时,Ehcache 将会根据 

指定的策略去清理内存。默认策略是 LRU(最近最少使用)。你可以设置为 FIFO(先进先 

出)或是 LFU(较少使用) 

--> 

<defaultCache overflowToDisk="true" eternal="false"/> 

<diskStore path="D:/cache" /> 

<!-- 

<cache name="sxtcache" overflowToDisk="true" eternal="false" 

timeToIdleSeconds="300" timeToLiveSeconds="600" maxElementsInMemory="1000" 

maxElementsOnDisk="10" diskPersistent="true"  

diskExpiryThreadIntervalSeconds="300" 

diskSpoolBufferSizeMB="100" memoryStoreEvictionPolicy="LRU" /> 

--> 

prueba:

@Test 

public void test04() { 

    SqlSession sqlSession=sqlSessionFactory.openSession();  

    AccountDao accountDao=sqlSession.getMapper(AccountDao.class);  

    Account account=accountDao.queryAccountById(1); 

    System.out.println(account); 

    sqlSession.close(); 

    SqlSession sqlSession2=sqlSessionFactory.openSession(); 

    AccountDao accountDao2=sqlSession2.getMapper(AccountDao.class);  

    accountDao2.queryAccountById(1); 

    sqlSession.close(); 

} 

Efecto:
Tasa de aciertos de caché [com.xxx.dao.AccountDao]: 0.5

Supongo que te gusta

Origin blog.51cto.com/15047271/2569700
Recomendado
Clasificación