mybatis缓存之二级缓存

二级缓存(全局缓存):基于namespace级别的缓存,一个namespace对应一个二级缓存。

工作机制:

  • 一个会话,查询一条数据,这条数据会放在当前会话的一级缓存中;
  • 如果会话关闭,该会话对应的一级缓存就消失了;
  • 可以使用二级缓存将保存之前的一级缓存,新的会话要查询相同的信息就可以从二级缓存中获取。

使用过程:

  • 开启二级缓存全局配置;
  • <setting name="cacheEnabled" value="true"/>
  • 在mapper.xml配置使用二级缓存<cache></cache>
  • POJO需要实现序列化接口
<setting name="lazyLoadingEnabled" value="true"/>
<mapper namespace="com.gong.mybatis.dao.EmployeeMapper">
    <cache eviction="FIFO" flushInterval="60000" readOnly="false" size="1024">
        <!--
            eviction:缓存的回收策略,默认LRU
            flushInterval:缓存刷新间隔,默认不清空,可以设置一个毫秒值
            readOnly:只读为true,所有从缓存中获取操作都是只读操作,不会修改数据,直接将数据在缓存中的引用交给用户;
                     非只读,获取的数据可能会被修改,会利用序列化&反序列化的技术克隆一份新的数据,安全,但速度慢。
            size:缓存存放多少元素
            type:指定自定义缓存的全类名,实现Cache接口即可
         -->
    </cache>

    ......
</mapper>
public class Employee implements Serializable

测试:

package com.gong.mybatis.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import com.gong.mybatis.bean.Department;
import com.gong.mybatis.bean.Employee;
import com.gong.mybatis.dao.EmployeeMapper;
import com.gong.mybatis.mapper.EmployeeMapperDynamicSql;

public class TestMybatis4 {

    public SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream is = Resources.getResourceAsStream(resource);
        return new SqlSessionFactoryBuilder().build(is);
    }

    @Test
    public void test() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession openSession = sqlSessionFactory.openSession();
        SqlSession openSession2 = sqlSessionFactory.openSession();

        try {
            EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
            EmployeeMapper mapper2 = openSession2.getMapper(EmployeeMapper.class);
            Employee em = mapper.getEmpById(1);
            System.out.println(em);
            openSession.close();
            Employee em2 = mapper2.getEmpById(1);
            System.out.println(em2);
            openSession.close();
        } finally {
            // TODO: handle finally clause

        }

    }

}

输出:

DEBUG 01-22 10:59:28,726 Cache Hit Ratio [com.gong.mybatis.dao.EmployeeMapper]: 0.0  (LoggingCache.java:62)
DEBUG 01-22 10:59:29,055 ==>  Preparing: select id,last_name lastName,email,gender from tbl_employee where id = ?   (BaseJdbcLogger.java:145)
DEBUG 01-22 10:59:29,102 ==> Parameters: 1(Integer)  (BaseJdbcLogger.java:145)
DEBUG 01-22 10:59:29,148 <==      Total: 1  (BaseJdbcLogger.java:145)
Employee [id=1, lastName=dema, gender=1, email[email protected], dept=null]
DEBUG 01-22 10:59:29,242 Cache Hit Ratio [com.gong.mybatis.dao.EmployeeMapper]: 0.5  (LoggingCache.java:62)
Employee [id=1, lastName=dema, gender=1, email[email protected], dept=null]

需要注意是要在第一个会话结束之后要先关闭,否则如果在最后一起关闭,就变成一级缓存的情况了。

和缓存相关的设置:

  • cacheEnabled:true为开启二级缓存
  • 每个select标签都有useCache属性,该属性默认为true,如果置为false,表明不使用二级缓存
  • 每个增删改标签都有flushCache属性,该属性默认为true,执行后清除缓存。(一级缓存、二级缓存都会被清空)
  • 每个select标签也有flushCache属性,默认为false
  • sqlSession.clearCache()只清除一级缓存
  • localCacheScope设置:本地缓存作用域,取SESSION表明一级缓存:当前会话的所有数据保存在会话缓存中。取STATEMENT可以禁用一级缓存。

原文地址:https://www.cnblogs.com/xiximayou/p/12228177.html

时间: 2024-11-06 07:24:05

mybatis缓存之二级缓存的相关文章

myBatis学习(9):一级缓存和二级缓存

正如大多数持久层框架一样,MyBatis同样提供了一级缓存和二级缓存的支持 1. MyBatis一级缓存基于PerpetualCache的HashMap本地缓存,其存储作用域为 Session,默认情况下,一级缓存是开启状态的.当 Session flush(); 或 close(); 之后,该Session中的所有 Cache 就将清空. 2.MyBatis二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Nam

Mybatis中的一级缓存和二级缓存

1.概述 mybatis提供查询缓存主要是为了减轻了数据库的压力,提高了系统的性能. 缓存分为一级缓存和二级缓存,他们之间的关系和区别如下: 一级缓存是sqlSession级别的缓存.在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(hashmap)对象缓存数据.不同的sqlSession之间的数据缓存区域是不互相影响的. 二级缓存是mapper级别的缓存.多个sqlSession去操作同一个mapper中的sql语句,多个sqlSession共享同一个Mapper的二级缓

【MyBatis学习13】MyBatis中的二级缓存

1. 二级缓存的原理 前面介绍了,mybatis中的二级缓存是mapper级别的缓存,值得注意的是,不同的mapper都有一个二级缓存,也就是说,不同的mapper之间的二级缓存是互不影响的.为了更加清楚的描述二级缓存,先来看一个示意图: 从图中可以看出: sqlSession1去查询用户id为1的用户信息,查询到用户信息会将查询数据存储到该UserMapper的二级缓存中. 如果SqlSession3去执行相同 mapper下sql,执行commit提交,则会清空该UserMapper下二级缓

Mybatis学习笔记-二级缓存

~ 缓存是提供应用系统性能的重要手段,前面已经介绍过Mybatis是一级缓存,与一级缓存不同的是,二级缓存的作用范围扩大到了应用级别,并且可以比一级缓存更细粒度的对二级缓存的应用进行配置.下面就详细叙述一下Mybatis的二级缓存实现. 二级缓存的工作流程 不多说,先上图,图解是攻城狮最好的朋友^_^- 前面在叙述一级缓存的时候已经说过,一级缓存是一块放在Executor中的map内存块.试想一下,如果二级缓存也是Executor中的内存块可以可以呢?-- 当然不可以!为啥?因为二级缓存要支持细

10.MyBatis 延迟加载,一级缓存,二级缓存 设置

什么是延迟加载  resultMap中的association和collection标签具有延迟加载的功能. 延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息.使用关联信息时再去加载关联信息. 设置延迟加载 需要在SqlMapConfig.xml文件中,在<settings>标签中设置下延迟加载. lazyLoadingEnabled.aggressiveLazyLoading 设置项 描述 允许值 默认值 lazyLoadingEnabled 全局性设置懒加载.如果设为'fals

Mybatis学习笔记-一级缓存与二级缓存

1.一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为session,当session被flush或close之后,该session中的所有Cache就将清空. 2.二级缓存与一级缓存机制相同,默认也采用PerpetualCache HashMap存储,不同在于其存储作用域为Mapper(Namespace),并且可自定义存储源,如Ehcache. 3.对于缓存数据更新机制,当一个作用域(一级缓存session/二级缓存Namespace )进行了C/U/D操作后

MyBatis从入门到放弃六:延迟加载、一级缓存、二级缓存

前言 使用ORM框架我们更多的是使用其查询功能,那么查询海量数据则又离不开性能,那么这篇中我们就看下mybatis高级应用之延迟加载.一级缓存.二级缓存.使用时需要注意延迟加载必须使用resultMap,resultType不具有延迟加载功能. 一.延迟加载 延迟加载已经是老生常谈的问题,什么最大化利用数据库性能之类之类的,也懒的列举了,总是我一提到延迟加载脑子里就会想起来了Hibernate get和load的区别.OK,废话少说,直接看代码. 先来修改配置项xml. 注意,编写mybatis

mybatis 一级缓存和二级缓存

1.默认是会话期内 一级session缓存 2.二级缓存: 引入二级缓存的jar, 配置 ehcache.xml, mapper.xml引入缓存<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache> 如下mapper: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PU

mybatis学习笔记(13)-查询缓存之二级缓存

mybatis学习笔记(13)-查询缓存之二级缓存 mybatis学习笔记13-查询缓存之二级缓存 二级缓存原理 开启二级缓存 调用pojo类实现序列化接口 测试方法 useCache配置 刷新缓存就是清空缓存 应用场景和局限性 本文主要讲mybatis的二级缓存,二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的. 二级缓存原理 首先开启mybatis的二级缓存. sqlS

Mybatis使用Redis二级缓存

在Mybatis中允许开发者自定义自己的缓存,本文将使用Redis作为Mybatis的二级缓存.在Mybatis中定义二级缓存,需要如下配置: 1. MyBatis支持二级缓存的总开关:全局配置变量参数“cacheEnabled=true” 2.select语句所在的Mapper需配置了<cache> 或<cached-ref>节点 3.select语句的参数 useCache=true Mybatis配置文件如下: <settings> <!-- 这个配置使全局