MyBatis总结八:缓存介绍(一级缓存,二级缓存)

MyBatis总结八:缓存介绍(一级缓存,二级缓存)

简介

为数据库的查询进行缓存,是减少数据库压力的主要途径。分为一级缓存和二级缓存。

一级缓存:session级别缓存,作用于当前会话。

二级缓存:SessionFactory级别缓存,作用于整个SessionFactory,多个会话之间可以共享缓存

 

一级缓存:

特点:

  • mybatis的一级缓存默认就是开启的,并且无法关闭。

  • mybatis的一级缓存作用域是当前session,一次openSession()后,如果相同的statement和相同参数,则不进行查询而是从缓存命中并且返回,如果没有命中则查询数据库。

  • 任何的增删改操作都会导致缓存被清空

  • 缓存会使用 Least Recently Used(LRU,最近最少使用的)算法来收回

测试一级缓存:

    @Test
    public void testLevelOneCache() throws Exception {
        User user1 = mapper.getUserById(1);
        System.out.println(user1);
        System.out.println("---------------------------");
        User user2 = mapper.getUserById(1);
        System.out.println(user2);
    }

输出结果:

我们可以看出来 第二次查询的时候 并没有执行sql语句 而是从缓存中读取的。

 

二级缓存:

特点:

  • 二级缓存需要手动开启,开启的方式是在Mapper.xml中添加标签:<cache/>

  • 二级缓存的作用域是整个SessionFactory,并且是同一个Mapper中,如果namespace、statement和SQL参数一致,则缓存命中

  • 映射语句文件中的所有select语句将会被缓存。

  • 映射语句文件中的所有insert,update和delete语句会刷新缓存。

  • 缓存会使用Least Recently Used(LRU,最近最少使用的)算法来收回。

  • 缓存会根据指定的时间间隔来刷新。

  • 缓存默认会存储1024个对象

开启二级缓存:

<mapper namespace="com.zy.mapper.UserMapper">
    <!--开启二级缓存-->
    <cache />

测试二级缓存:

注意这里有个前提条件,就是User类必须继承Serializable接口

public class UserMapperTest {
    UserMapper mapper;
    SqlSessionFactory sqlSessionFactory;
    SqlSession sqlSession;

    @Before
    public void setUp() throws Exception {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        sqlSession = sqlSessionFactory.openSession(true);
        mapper = sqlSession.getMapper(UserMapper.class);
    }

    @Test
    public void testLevelTwoCache() {
        // 一次会话中
        // 1 第1次查询
        User user1 = mapper.getUserById(1);
        System.out.println(user1);

        // 关闭session
        sqlSession.close();
        // 重新开启session
        sqlSession = sqlSessionFactory.openSession(true);
        // 重新获取mapper
        mapper = sqlSession.getMapper(UserMapper.class);
        System.out.println("------------------------------------------");

        // 2 第2次查询
        User user2 = mapper.getUserById(1);
        System.out.println(user2);
    }

}

cache标签常用属性:

<cache 
eviction="FIFO"  <!--回收策略为先进先出-->
flushInterval="60000" <!--自动刷新时间60s-->
size="512" <!--最多缓存512个引用对象-->
readOnly="true"/> <!--只读-->

 

这个更高级的配置创建了一个 FIFO 缓存,并每隔 60 秒刷新,存数结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此在不同线程中的调用者之间修改它们会 导致冲突。

可用的收回策略有:

  • LRU – 最近最少使用的:移除最长时间不被使用的对象。

  • FIFO – 先进先出:按对象进入缓存的顺序来移除它们。

  • SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。

  • WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

默认的是 LRU。

flushInterval(刷新间隔)可以被设置为任意的正整数,而且它们代表一个合理的毫秒 形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。

size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的 可用内存资源数目。默认值是 1024。

readOnly(只读)属性可以被设置为 true 或 false。只读的缓存会给所有调用者返回缓 存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存 会返回缓存对象的拷贝(通过序列化) 。这会慢一些,但是安全,因此默认是 false。

 

另外mybatis-config.xml中的settings中有个参数叫做cacheEnabled,默认为true表示开启缓存,如果设置为flase所有的缓存将消失。

 

posted @ 2017-04-08 21:45 青衫仗剑 阅读( ...) 评论( ...) 编辑 收藏
1. 用户与身体信息管理模块 用户信息管理: 注册登录:支持手机号 / 邮箱注册,密码加密存储,提供第三方快捷登录(模拟) 个人资料:记录基本信息(姓名、年龄、性别、身高、体重、职业) 健康目标:用户设置目标(如 “减重 5kg”“增肌”“维持健康”)及期望周期 身体状态跟踪: 体重记录:定期录入体重数据,生成体重变化曲线(折线图) 身体指标:记录 BMI(自动计算)、体脂率(可选)、基础代谢率(根据身高体重估算) 健康状况:用户可填写特殊情况(如糖尿病、过敏食物、素食偏好),系统据此调整推荐 2. 膳食记录与食物数据库模块 食物数据库: 基础信息:包含常见食物(如米饭、鸡蛋、牛肉)的名称、类别(主食 / 肉类 / 蔬菜等)、每份重量 营养成分:记录每 100g 食物的热量(kcal)、蛋白质、脂肪、碳水化合物、维生素、矿物质含量 数据库维护:管理员可添加新食物、更新营养数据,支持按名称 / 类别检索 膳食记录功能: 快速记录:用户选择食物、输入食用量(克 / 份),系统自动计算摄入的营养成分 餐次分类:按早餐 / 午餐 / 晚餐 / 加餐分类记录,支持上传餐食照片(可选) 批量操作:提供常见套餐模板(如 “三明治 + 牛奶”),一键添加到记录 历史记录:按日期查看过往膳食记录,支持编辑 / 删除错误记录 3. 营养分析模块 每日营养摄入分析: 核心指标计算:统计当日摄入的总热量、蛋白质 / 脂肪 / 碳水化合物占比(按每日推荐量对比) 微量营养素分析:检查维生素(如维生素 C、钙、铁)的摄入是否达标 平衡评估:生成 “营养平衡度” 评分(0-100 分),指出摄入过剩或不足的营养素 趋势分析: 周 / 月营养趋势:用折线图展示近 7 天 / 30 天的热量、三大营养素摄入变化 对比分析:将实际摄入与推荐量对比(如 “蛋白质摄入仅达到推荐量的 70%”) 目标达成率:针对健
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值