缓存 (Java+Oracle框架--mybatis)

本文详细介绍了Mybatis的一级缓存和二级缓存的工作原理、开启方式、生命周期及注意事项。一级缓存默认开启,作用于同一SqlSession,而二级缓存需手动配置,作用于整个SqlSessionFactory,适用于查询频繁、更新较少的场景。二级缓存的命中率可通过配置文件进行监控。
摘要由CSDN通过智能技术生成

缓存

​ 缓存的重要性是不言而喻的。 使用缓存, 我们可以避免频繁的与数据库进行交互, 尤其是在查询越多、缓存命 中率越高的情况下, 使用缓存对性能的提高更明显。

​ mybatis 也提供了对缓存的支持, 分为一级缓存和二级缓存。 但是在默认的情况下, 只开启一级缓存

一级缓存

缓存的原理

​ 在同一个 SqlSession 中, Mybatis 会把执行的方法和参数通过算法生成缓存的键值, 将键值和结果存放在一个 Map 中, 如果后续的键值一样, 则直接从 Map中获取数据;

缓存的开启

​ 默认开启

缓存的生命周期

  1. 在一个 SqlSession 生命周期中有效. SqlSession 关闭, 缓存清空;
  2. 不同的 SqlSession 之间的缓存是相互隔离的;

缓存的清空

  1. 用一个 SqlSession,可以通过配置使得在查询前清空缓存;在具体xml文件的select语句中使用flushCache=“true” 就能
  2. 任何的 UPDATE, INSERT, DELETE 语句都会清空缓存

缓存的注意点

​ 线程级别的缓存, SqlSession 的缓存;

具体例子:

UserMapper接口

package com.xxxx.mappers;

import com.xxxx.pojo.User;

import java.util.List;

//测试一级缓存
public interface UserMapper {
   
    //查询所有的数据
    List<User> queryAll();
}

UserMapper.xml (如果在下面的select标签中 使用了属性 flushCache=“true” 那么会清空缓存,第二次就不会使用缓存)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxxx.mappers.UserMapper">
    <!--测试一级缓存-->
    <select id="queryAll" resultType="user">  <!-- flushCache="true"-->
        select username,password from t_user
    </select>
</mapper>

测试:这里可以看到使用了缓存查询,所以第二次查询没有打印出日志的sql

(必须要使用同一个Session并且调用的是同一个方法才有一级缓存)

package com.xxxx.test;

import com.xxxx.mappers.UserMapper;
import com.xxxx.pojo.User;
import com.xxxx.utils.SessionUtils;
import org.apache.ibatis.session.SqlSession;

import java.util.List;

/*
    一级缓存: 默认开启 SqlSession
 */
public class CacheDemo02 {
   
    public static void main(String[] args) {
   
        SqlSession session = SessionUtils.getSession();

        UserMapper mapper = session.getMapper(UserMapper.class);
        System.out.println("--------------默认开启一级缓存----------------");
        System.out.println("--------------第一次查询----------------");

        List<User> list = mapper.queryAll();
        list.forEach(System.out::println);

        System.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值