第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

Mybatis二級(jí)緩存教程:輕松入門(mén)與實(shí)踐

標(biāo)簽:
SSM
概述

本文档介绍了Mybatis一级和二级缓存的概念与原理,详细说明了如何启用和配置二级缓存,并探讨了二级缓存的工作机制和适用场景。文章还提供了实际项目中的应用示例,帮助读者更好地理解和应用Mybatis二级缓存技术。

Mybatis二级缓存教程:轻松入门与实践
Mybatis缓存简介

一级缓存与二级缓存的概念

Mybatis使用了两种缓存机制:一级缓存和二级缓存。

  • 一级缓存:也被称为会话级缓存(Session Cache),它是Mybatis中最基础的缓存机制。每个SqlSession对象都包含一个与之相关的缓存。当执行SqlSession的查询操作时,Mybatis会先检查缓存中是否存在该查询的结果。如果存在,会直接返回缓存中的数据,避免进行数据库查询。一级缓存是自动开启的,无需手动配置,但当SqlSession对象关闭时,一级缓存会被清空。

  • 二级缓存:也称为共享缓存(Shared Cache),它可以在会话之外进行结果的共享。二级缓存可以被多个SqlSession共享,这意味着当一个SqlSession执行查询操作时,查询结果可以被其他SqlSession重用。二级缓存需要手动开启和配置。

缓存机制的基本原理

缓存机制的基本原理是将数据库查询的结果暂时存储在内存中。当后续的查询请求与缓存中的数据匹配时,直接从缓存中读取数据,而非执行数据库查询,以此提高系统的响应速度和性能。

  • 一级缓存:当SqlSession执行查询操作时,结果会被存储在SqlSession的缓存中。当再次执行相同的查询时,如果缓存中存在结果,则直接返回缓存中的数据,否则执行数据库查询。一级缓存的生命周期与SqlSession相同,当SqlSession关闭时,一级缓存中的数据也会被清空。

  • 二级缓存:当SqlSession执行查询操作时,结果会被存储到二级缓存中。其他SqlSession在执行相同的查询时,会优先从二级缓存中读取数据。二级缓存的生命周期可以配置为持久化或其他状态,以便在SqlSession关闭后仍然保持缓存中的数据。
二级缓存的启用与配置

开启二级缓存的基本步骤

要启用Mybatis的二级缓存,需要进行以下几个步骤:

  1. 在Mybatis配置文件中启用二级缓存
  2. 为Mapper接口或Mapper XML文件配置缓存

MyBatis配置文件中的缓存配置

在Mybatis的全局配置文件mybatis-config.xml中,可以通过添加<setting>标签来启用二级缓存。二级缓存默认是关闭的,需要手动开启。

<configuration>
    <!-- 开启缓存 -->
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>
</configuration>

接下来,在Mapper XML文件或Mapper接口上使用@CacheNamespace注解(对于Mapper接口)或<cache>标签(对于Mapper XML文件)来启用二级缓存。

Mapper XML文件的缓存配置

在Mapper XML文件中,通过添加<cache>标签来启用二级缓存。

<mapper namespace="com.example.mapper.UserMapper">
    <cache />
    <!-- 映射语句 -->
    <select id="selectUserById" resultType="com.example.model.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
</mapper>

Mapper接口的缓存配置

在Mapper接口上,通过使用@CacheNamespace注解来启用二级缓存。

package com.example.mapper;

import org.apache.ibatis.annotations.CacheNamespace;
import com.example.model.User;

@CacheNamespace
public interface UserMapper {
    User selectUserById(int id);
}

通过上述配置,Mybatis的二级缓存就被成功启用了。

二级缓存的工作原理

二级缓存的存储机制

二级缓存存储机制指的是Mybatis如何将查询结果存储到缓存中以及如何从缓存中读取数据。

  • 存储机制:当一个SqlSession执行查询操作时,查询的结果会被序列化并存储到二级缓存中。缓存中的数据采用键值对的形式存储,键通常是查询的SQL语句,值是查询的结果集。

  • 读取机制:当另一个SqlSession执行相同的查询时,Mybatis会首先检查二级缓存中是否存在相应的结果。如果存在,则直接从缓存中读取数据并返回;如果不存在,则执行数据库查询。

缓存的读取与写入流程

  1. 读取流程

    • SqlSession执行查询操作。
    • Mybatis检查二级缓存中是否存在相应的结果。
    • 如果存在,则直接返回缓存中的结果。
    • 如果不存在,则执行数据库查询,并将结果存储到二级缓存中。
  2. 写入流程
    • SqlSession执行查询操作。
    • Mybatis将查询结果序列化并存储到二级缓存中。
    • 缓存中的数据会被持久化到磁盘或内存中,以便在SqlSession关闭后仍然保持缓存数据。

缓存读取与写入的具体代码示例

SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);

// 执行查询操作
User user = mapper.selectUserById(1);
System.out.println("First query result: " + user);

// 清除缓存
sqlSession.clearCache();

// 再次执行查询操作
User user2 = mapper.selectUserById(1);
System.out.println("Second query result: " + user2);
二级缓存的使用场景

二级缓存适用的业务场景

二级缓存适用于以下几种情况:

  • 频繁查询相同数据:当应用程序频繁执行相同的查询操作时,使用二级缓存可以显著提高性能,减少数据库访问次数。
  • 读多写少的数据访问模式:当数据被频繁读取但修改较少时,使用二级缓存可以提高系统响应速度。
  • 减轻数据库压力:使用缓存可以减轻数据库压力,避免频繁的数据库查询操作。

常见问题与解决方案

  1. 缓存数据不一致:当数据被修改时,缓存中的数据可能仍为旧数据。可以使用缓存更新策略(如FIFO或LRU)来确保缓存中的数据是最新的。

  2. 缓存穿透:当缓存中不存在某些查询结果时,查询请求会直接穿透到数据库。可以使用缓存空值策略来避免缓存穿透。

  3. 缓存击穿:当大量请求同时访问某个热点数据,导致缓存失效后,大量的请求直接访问数据库,造成数据库压力过大。可以通过设置缓存失效时间或使用分布式锁来避免缓存击穿。

缓存更新策略的具体代码示例

@CacheNamespace(ehcacheNamespace = "com.example.mapper.UserMapper")
public interface UserMapper {
    User selectUserById(int id);
}
二级缓存的测试与调试

如何测试缓存是否生效

要测试二级缓存是否生效,可以通过以下步骤进行:

  1. 执行查询操作:使用SqlSession执行查询操作,确保查询结果被存储到缓存中。
  2. 关闭SqlSession:关闭当前的SqlSession。
  3. 重新查询数据:使用另一个SqlSession执行相同的查询操作,检查是否从缓存中读取了数据。
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);

// 第一次查询
User user = mapper.selectUserById(1);
System.out.println("First query result: " + user);

sqlSession.close();

// 第二次查询
SqlSession sqlSession2 = sqlSessionFactory.openSession();
UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class);
User user2 = mapper2.selectUserById(1);
System.out.println("Second query result: " + user2);

sqlSession2.close();

如果第二次查询从缓存中读取了数据,则证明二级缓存生效。

常见调试技巧

  1. 日志调试:通过查看Mybatis的日志输出,可以了解缓存读取和写入的详细情况。
  2. 缓存清除:在调试过程中,可以手动清除缓存,确保测试的准确性。
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);

// 清除缓存
mapper.selectUserById(1);
sqlSession.clearCache();
实战案例:搭建二级缓存环境

从零开始搭建Mybatis二级缓存环境

环境准备

  1. 搭建Mybatis环境

    • 使用Maven或Gradle管理依赖。
    • 配置数据库连接,例如MySQL。
  2. 创建实体类
    • 创建一个User实体类。
package com.example.model;

public class User {
    private int id;
    private String name;
    private String email;

    // Getter and Setter
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

启用二级缓存

  1. 全局配置文件
    • mybatis-config.xml配置文件中启用缓存。
<configuration>
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>
</configuration>
  1. Mapper XML文件配置
    • 在Mapper XML文件中启用二级缓存。
<mapper namespace="com.example.mapper.UserMapper">
    <cache />
    <select id="selectUserById" resultType="com.example.model.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
</mapper>
  1. Mapper接口配置
    • 在Mapper接口上使用@CacheNamespace注解启用二级缓存。
package com.example.mapper;

import org.apache.ibatis.annotations.CacheNamespace;
import com.example.model.User;

@CacheNamespace
public interface UserMapper {
    User selectUserById(int id);
}

测试缓存生效

  1. 编写测试代码
    • 编写测试代码,测试二级缓存是否生效。
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class TestCache {

    public static void main(String[] args) {
        // 构建SqlSessionFactory
        String resource = "mybatis-config.xml";
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resource));

        // 第一次查询
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.selectUserById(1);
        System.out.println("First query result: " + user);
        sqlSession.close();

        // 第二次查询
        SqlSession sqlSession2 = sqlSessionFactory.openSession();
        UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class);
        User user2 = mapper2.selectUserById(1);
        System.out.println("Second query result: " + user2);
        sqlSession2.close();
    }
}

数据库操作

  1. 创建数据库表
    • 创建一个名为user的数据库表。
CREATE TABLE `user` (
    `id` INT NOT NULL,
    `name` VARCHAR(45) NOT NULL,
    `email` VARCHAR(45) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB;
  1. 插入测试数据
    • user表中插入一些测试数据。
INSERT INTO `user` (`id`, `name`, `email`) VALUES (1, '张三', 'zhangsan@example.com');
INSERT INTO `user` (`id`, `name`, `email`) VALUES (2, '李四', 'lisi@example.com');

实际项目中的应用示例

项目场景

假设有一个用户管理系统,其中存在频繁查询用户信息的需求。使用二级缓存可以显著提高系统的响应速度和性能。

编写Mapper接口和XML文件

  1. Mapper接口
    • 编写一个UserMapper接口,定义查询用户信息的方法。
package com.example.mapper;

import com.example.model.User;
import org.apache.ibatis.annotations.CacheNamespace;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
@CacheNamespace
public interface UserMapper {
    @Select("SELECT * FROM user WHERE id = #{id}")
    User selectUserById(int id);
}
  1. Mapper XML文件
    • 编写一个UserMapper.xml文件,定义查询用户信息的SQL语句。
<mapper namespace="com.example.mapper.UserMapper">
    <cache />
    <select id="selectUserById" resultType="com.example.model.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
</mapper>

连接数据库并配置Mybatis

  1. 配置数据库连接
    • mybatis-config.xml中配置数据库连接信息。
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>
</configuration>
  1. 启动应用并测试缓存
    • 启动应用并测试用户信息查询,验证缓存是否生效。
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class TestCache {

    public static void main(String[] args) {
        // 构建SqlSessionFactory
        String resource = "mybatis-config.xml";
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resource));

        // 第一次查询
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.selectUserById(1);
        System.out.println("First query result: " + user);
        sqlSession.close();

        // 第二次查询
        SqlSession sqlSession2 = sqlSessionFactory.openSession();
        UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class);
        User user2 = mapper2.selectUserById(1);
        System.out.println("Second query result: " + user2);
        sqlSession2.close();
    }
}
點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫(xiě)下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消