MyBatis: caché de consultas

Consultar caché

El alcance del caché de primer nivel de Mybatis es la misma SqlSession. La misma instrucción SQL se ejecuta dos veces en el mismo sqlSession. Después de la primera ejecución, los datos consultados en la base de datos se escribirán en el caché (memoria), y la segunda vez se obtendrá del caché Los datos ya no se consultarán desde la base de datos, mejorando así la eficiencia de la consulta. Cuando termina una sesión de sqlSession, la caché de primer nivel en la sesión de sqlSession no existe. Mybatis habilita el caché de primer nivel de forma predeterminada. 

La caché secundaria de Mybatis es compartida por múltiples SqlSessions, y su alcance es el mismo espacio de nombres del mapeador. Diferentes sqlSessions ejecutan la instrucción sql bajo el mismo espacio de nombres dos veces y pasan los mismos parámetros al sql, que finalmente ejecuta la misma instrucción sql. Una vez que se completa la ejecución, los datos consultados en la base de datos se escribirán en el caché (memoria), y la segunda vez que los datos se obtengan del caché no se consultarán desde la base de datos, lo que mejora la eficiencia de la consulta. Mybatis no habilita el caché secundario de forma predeterminada. Debe habilitar el caché secundario en la configuración de los parámetros globales.

Caché de nivel 1

El área de caché de primer nivel se divide según SqlSession.

Cada consulta se encontrará primero en el área de caché. Si no se encuentra ninguna consulta de la base de datos, los datos se escribirán en la caché cuando se encuentre la consulta.

El caché de almacenamiento interno de Mybatis usa un HashMap, la clave es hashCode + sqlId + Sql, y el valor es un objeto java generado a partir de la asignación de consultas.

Después de que sqlSession realice operaciones de inserción, actualización, eliminación y otras operaciones, el área de confirmación se borrará después de que se envíe la confirmación.

Caché secundaria

El área de caché secundaria se divide de acuerdo con el espacio de nombres del mapeador. Los datos de consulta del mapeador del mismo espacio de nombres se colocan en la misma área. Si se utiliza el método proxy del mapeador, el espacio de nombres de cada mapeador es diferente. En este momento, se puede entender que el área de caché secundaria se divide de acuerdo con el mapeador .

Cada consulta se encontrará primero en el área de caché. Si no se encuentra ninguna consulta de la base de datos, los datos se escribirán en la caché cuando se encuentre la consulta.

El caché de almacenamiento interno de Mybatis utiliza un HashMap, la clave es hashCode + sqlId + Sql. valor es el objeto java generado por la asignación de la consulta

Después de que sqlSession realice operaciones de inserción, actualización, eliminación y otras operaciones, el área de confirmación se borrará después de que se envíe la confirmación.

Encienda el caché secundario

Agregue el archivo de configuración central SqlMapConfig.xml

<setting name="cacheEnabled" value="true"/>

 

Descripción

Valor permitido

Valor por defecto

cacheEnabled

Establezca la configuración global de encendido / apagado para todas las cachés en este archivo de configuración.

verdadero Falso

cierto

Para agregar una línea en su archivo de mapeo de Mapper: <caché />, lo que significa que este mapeador habilita el caché secundario.

El caché secundario necesita el objeto pojo mapeado por el resultado de la consulta para implementar la interfaz java.io.Serializable para implementar las operaciones de serialización y deserialización. Tenga en cuenta que si hay una clase padre, el pojo miembro debe implementar la interfaz de serialización.

public class Orders implements Serializable
public class User implements Serializable

Deshabilitar caché secundario

Establecer useCache = false en la instrucción puede deshabilitar el caché de segundo nivel de la instrucción select actual, es decir, cada consulta emitirá sql para consultar. El valor predeterminado es verdadero, es decir, el sql usa el caché de segundo nivel.

<select id="findOrderListResultMap" resultMap="ordersUserMap" useCache="false">

Actualizar el caché

En el mismo espacio de nombres del asignador, si hay otros datos de operación de inserción, actualización y eliminación, la memoria caché debe actualizarse. Si la memoria caché no se actualiza, se producirá una lectura sucia.

Establezca la propiedad flushCache = "true" en la configuración de la instrucción. De forma predeterminada, es verdadero para actualizar la memoria caché. Si se cambia a falso, no se actualizará. Al usar el caché, si modifica manualmente los datos de la consulta en la tabla de la base de datos, habrá lecturas sucias.

<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User" flushCache="true">

Parámetros de MyBatis Cache

flushInterval (intervalo de actualización) se puede establecer en cualquier número entero positivo, y representan un período de tiempo razonable en forma de milisegundos. De forma predeterminada, no está configurado, es decir, no hay intervalo de actualización y la memoria caché se actualiza solo cuando se llama a la instrucción.

el tamaño (número de referencias) se puede establecer en cualquier número entero positivo, recuerde el número de objetos que almacena en caché y el número de recursos de memoria disponibles en su entorno de ejecución. El valor predeterminado es 1024.

El atributo readOnly se puede establecer en verdadero o falso. Un caché de solo lectura devolverá la misma instancia del objeto de caché a todos los llamantes. Por lo tanto, estos objetos no pueden modificarse. Esto proporciona una ventaja de rendimiento muy importante. La memoria caché de lectura y escritura devolverá una copia del objeto en caché (a través de la serialización). Esto será más lento, pero seguro, por lo que el valor predeterminado es falso.

 <cache  eviction="FIFO"  flushInterval="60000"  size="512"  readOnly="true"/>

Esta configuración más avanzada crea un búfer FIFO y lo actualiza cada 60 segundos, almacenando 512 referencias al objeto o lista de resultados, y el objeto devuelto se considera de solo lectura, por lo que entre las personas que llaman en diferentes hilos Modificarlos causará conflictos. Las estrategias de recuperación disponibles son, el valor predeterminado es LRU:

  • LRU-menos utilizado recientemente: eliminar objetos que no se han utilizado durante más tiempo.
  • FIFO - primero en entrar, primero en salir: eliminar objetos en el orden en que ingresan al caché.
  • Referencia SOFT-Soft: elimine objetos según el estado del recolector de basura y las reglas de referencia soft.
  • Referencia DÉBIL-Débil: Elimine objetos de forma más agresiva en función del estado del recolector de basura y las reglas de referencia débiles.

Integración MyBatis Ehcache

EhCache es un marco de almacenamiento en caché en proceso puro de Java. Es un caché distribuido Java de código abierto ampliamente utilizado. Tiene las características de rápido y esbelto. Es el CacheProvider predeterminado en Hibernate.

Integración: la parte de I + D personal del software se entrega a la parte general del software para descubrir los problemas de la parte de desarrollo personal lo antes posible.

Implementación: el código se entrega a la sección de desarrollo / prueba ejecutable lo antes posible, para que pueda probarse lo antes posible.

Entrega: I + D se entrega a los clientes lo antes posible para descubrir problemas en el entorno de producción lo antes posible.

Distribuido: un servicio se divide en múltiples sub-servicios y se implementa en diferentes servidores.

Implementación de clúster: el mismo servicio se implementa en varios servidores.

Principio de integración de Mybatis ehcache

Mybatis proporciona una interfaz de caché secundaria, de la siguiente manera:

 

Su clase de implementación predeterminada:

Al implementar la interfaz de caché, los datos de caché de mybatis se pueden integrar a través de otras bases de datos de caché. La especialidad de mybatis es la operación sql. La gestión de los datos de caché no es la especialidad de mybatis. , Redis, etc.

Paso 1: Introducir dependencias en caché

maven坐标:
<dependency>
    <groupId>org.mybatis.caches</groupId>
    <artifactId>mybatis-ehcache</artifactId>
    <version>1.0.2</version>
</dependency>

Paso 2: introduzca el archivo de configuración de caché

Agregue bajo classpath: ehcache.xml, el contenido es el siguiente:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
    <diskStore path="F:\\develop\\ehcache" />
    <defaultCache 
        maxElementsInMemory="1000" 
        maxElementsOnDisk="10000000"
        eternal="false" 
        overflowToDisk="true" 
        timeToIdleSeconds="120"
        timeToLiveSeconds="120" 
        diskExpiryThreadIntervalSeconds="120"
        memoryStoreEvictionPolicy="LRU">
    </defaultCache>
</ehcache>

Descripción de la propiedad:

  • diskStorel: especifica la ubicación de almacenamiento de datos en el disco
  • defaultCachel: al crear Cache con la ayuda de CacheManager.add ("demoCache"), EhCache adoptará la estrategia de administración especificada por <defalutCache />

Se requieren los siguientes atributos:

  • maxElementsInMemory: el número máximo de elementos almacenados en memoria caché 
  • maxElementsOnDisk: el número máximo de elementos almacenados en caché en el disco, si 0 significa infinito
  • eternal-Establece si los elementos en caché nunca caducarán. Si es verdadero, los datos almacenados en caché siempre son válidos, si son falsos, deben juzgarse según timeToIdleSeconds, timeToLiveSeconds
  • overflowToDisk: establece si se deben almacenar en caché los elementos caducados en el disco cuando la memoria caché se desborda

Los siguientes atributos son opcionales:

  • timeToIdleSeconds: cuando el tiempo de dos visitas antes y después de que los datos almacenados en caché en EhCache excedan el valor de la propiedad timeToIdleSeconds, los datos se eliminarán. El valor predeterminado es 0, que es el tiempo inactivo infinito
  • timeToLiveSeconds: la vida útil efectiva del elemento de caché, el valor predeterminado es 0, es decir, el tiempo de supervivencia del elemento es infinito
  • diskSpoolBufferSizeMB: este parámetro establece el tamaño del área de búfer de DiskStore (caché de disco), el valor predeterminado es 30 MB, cada caché debe tener su propio búfer
  • diskPersistent: si se habilita el disco para guardar datos en EhCache cuando se reinicia la VM, el valor predeterminado es falso
  • diskExpiryThreadIntervalSeconds-Intervalo de ejecución del subproceso de limpieza de caché de disco, el valor predeterminado es 120 segundos. Cada 120 segundos, el hilo correspondiente limpiará los datos en EhCache
  • memoryStoreEvictionPolicy: cuando la memoria caché alcanza el máximo, cuando se agrega un nuevo elemento, elimine la estrategia del elemento de la memoria caché. El valor predeterminado es LRU (menos utilizado recientemente), LFU opcional (menos utilizado frecuentemente) y FIFO (primero en entrar, primero en salir)

Paso 3: enciende ehcache

EhcacheCache es la implementación de ehcache de la interfaz Cache:

Modifique el archivo mapper.xml, especifique EhcacheCache en la memoria caché y ajuste los parámetros de la memoria caché según sea necesario:

<cache type="org.mybatis.caches.ehcache.EhcacheCache" > 
    <property name="timeToIdleSeconds" value="3600"/>
    <property name="timeToLiveSeconds" value="3600"/>
    <!-- 同ehcache参数maxElementsInMemory -->
    <property name="maxEntriesLocalHeap" value="1000"/>
    <!-- 同ehcache参数maxElementsOnDisk -->
    <property name="maxEntriesLocalDisk" value="10000000"/>
    <property name="memoryStoreEvictionPolicy" value="LRU"/>
</cache>

Escenario de aplicación

Para las solicitudes de consulta con muchas visitas y los usuarios no tienen requisitos altos para los resultados de la consulta en tiempo real, la tecnología de caché secundaria mybatis se puede utilizar para reducir el acceso a la base de datos y mejorar la velocidad de acceso. Consulta sql etc.

El método de implementación es el siguiente: al configurar el intervalo de actualización, mybatis borra automáticamente el caché a intervalos y establece el intervalo de actualización del caché flushInterval de acuerdo con la frecuencia de los cambios de datos, como 30 minutos, 60 minutos, 24 horas, etc., según las necesidades.

Limitaciones

El caché de segundo nivel de Mybatis no es bueno para el almacenamiento en caché de nivel de datos detallado, como los siguientes requisitos: información del producto de caché, debido a la gran cantidad de visitas de consulta de información del producto, pero requiere que los usuarios consulten la última información del producto cada vez, si El uso del caché de segundo nivel de mybatis no puede darse cuenta de que cuando un producto cambia, solo se actualiza la información del caché del producto sin actualizar la información de otros productos, porque el área de caché de segundo nivel de mybaits se divide por la unidad de mapeo, cuando cambia la información de un producto, todo Se borran todos los datos de caché de la información del producto. Resolver estos problemas requiere el almacenamiento en caché de datos en la capa empresarial de acuerdo con la demanda.

202 artículos originales publicados · elogiados 37 · 30,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/lovecuidong/article/details/102729464
Recomendado
Clasificación