当前位置: 首页 > news >正文

邯郸网站建设浩森宇特中山网站seo

邯郸网站建设浩森宇特,中山网站seo,个人网站代做,河南做网站 河南网站建设文章目录缓存使用缓存源码测试代码上一篇《【Mybatis源码解析】mapper实例化及执行流程源码分析》,主要讲解了Mybatis的基本原理一级执行的流程,这一章来讲一下Mybatis的两个缓存:一级缓存和二级缓存。 因为网上大部分都是使用xml配置的方式…

文章目录

    • 缓存使用
    • 缓存源码
    • 测试代码

上一篇《【Mybatis源码解析】mapper实例化及执行流程源码分析》,主要讲解了Mybatis的基本原理一级执行的流程,这一章来讲一下Mybatis的两个缓存:一级缓存和二级缓存。

因为网上大部分都是使用xml配置的方式来使用缓存,所以我们这里讲解一下注解的方式。

一级缓存
一级缓存是SqlSession级别。一级缓存的作用域是 SqlSession , Mabits 默认开启一级缓存。 在同一个SqlSession中,执行相同的SQL查询时;第一次会去查询数据库,并写在缓存中,第二次会直接从缓存中取。 当执行SQL时候两次查询中间发生了增删改的操作,则SqlSession的缓存会被清空。

一级缓存 Mybatis的内部使用一个HashMap,key为hashcode+statementId+sql语句。Value为查询出来的结果集映射成的java对象。 Sqlsession执行insert、update、delete等操作commit后会清空该SqlSession缓存。

  1. MyBatis一级缓存的生命周期和SqlSession一致。每次执行update前都会清空localCache。

  2. MyBatis一级缓存内部设计简单,只是一个没有容量限定的HashMap,在缓存的功能性上有所欠缺。

  3. MyBatis的一级缓存最大范围是SqlSession内部,有多个SqlSession或者分布式的环境下,数据库写操作会引起脏数据,建议设定缓存级别为Statement,即关闭一级缓存。

二级缓存
二级缓存是Mapper级别的缓存,多个SqlSession去操作同一个Mapper中的sql语句,则这些SqlSession可以共享二级缓存,即二级缓存是跨SqlSession的。简单说就是同一个namespace 下的 mapper 映射文件中,用相同的sql去查询数据,会去对应的二级缓存内取结果。

MyBatis的二级缓存相对于一级缓存来说,实现了SqlSession之间缓存数据的共享,同时粒度更加的细,能够到namespace级别,通过Cache接口实现类不同的组合,对Cache的可控性也更强。

MyBatis在多表查询时,极大可能会出现脏数据,有设计上的缺陷,安全使用二级缓存的条件比较苛刻。

在分布式环境下,由于默认的MyBatis Cache实现都是基于本地的,分布式环境下必然会出现读取到脏数据,需要使用集中式缓存将MyBatis的Cache接口实现,有一定的开发成本,直接使用Redis、Memcached等分布式缓存可能成本更低,安全性也更高。

总结: 生产上建议关闭一级和二级缓存。

缓存使用

yml配置:

mybatis:configuration:# 驼峰大小写经典 Java 属性名 aColumn 的自动映射,默认值为falsemap-underscore-to-camel-case: true# statement: 关闭一级缓存;session:开启一级缓存 默认为sessionlocal-cache-scope: session# 开启二级缓存 默认为truecache-enabled: true# 打印sqllog-impl: org.apache.ibatis.logging.stdout.StdOutImpl

mapper接口(注解版):

@CacheNamespace注解:
作用于mapper接口上面,是用来实现二级缓存的,如果不指定实现类的话,默认就是PerpetualCache(实际上就是hashmap实现的)

@CacheNamespaceRef注解:
在多个命名空间中共享相同的缓存配置和实例

@Options(useCache = true,flushCache = Options.FlushCachePolicy.DEFAULT)注解:
useCache :是否用缓存,默认为true。
flushCache :是否刷新缓存,默认不刷新。

mapper接口(xml版):略。

在这里插入图片描述

缓存源码

新版的源码并没有太多改变,发送请求时,先从二级缓存中取,未取到则去一级缓存中取,仍未取到会去数据库中查,再存到一级缓存中,当事务提交之后,会存到二级缓存中,值得注意的是,mybatis中的一些cashe相关类挺有意思的,用来解决不同场景的问题,比如脏读。因为源码比较简单易懂,确实没什么值得可以写的,我想大家cv一下我的demo,debug一下应该就明白了。

在这里插入图片描述
在这里插入图片描述

  1. Mybatis在生产环境,是否应该开启缓存功能
  2. mybatis 开启二级缓存
  3. Mybatis开启本地二级缓存和使用redis开启二级缓存
  4. Mybatis 之 二级缓存
  5. 你尝试过在mybatis某个mapper上同时配置<cache/>和<cache-ref/>吗?
  6. Mybatis缓存源码分析

测试代码

controller

package com.ossa.web3.controller;import com.ossa.web3.bean.User;
import com.ossa.web3.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/user")
public class TestController {@Autowiredprivate UserMapper userMapper;@GetMapping("/l1cache")@Transactionalpublic User l1cache() {User user1 = userMapper.selectById("c5329f3b-3e98-4722-8faf-e87d9b981871");User user2 = userMapper.selectById("c5329f3b-3e98-4722-8faf-e87d9b981871");return null;}@GetMapping("/l2cache")public User l2cache() {return userMapper.selectById("c5329f3b-3e98-4722-8faf-e87d9b981871");}@DeleteMapping("/deleteById")public User deleteById() {return userMapper.deleteById("c5329f3b-3e98-4722-8faf-e87d9b981871");}
}

实体类

package com.ossa.web3.bean;import lombok.Data;import java.io.Serializable;@Data
public class User implements Serializable {private String id;private String name;private Integer age;
}

mapper接口

package com.ossa.web3.mapper;import com.ossa.web3.bean.User;
import org.apache.ibatis.annotations.*;@CacheNamespace
public interface UserMapper {@Select(value = "select * from user where id = #{id}")@Options(useCache = true,flushCache = Options.FlushCachePolicy.DEFAULT)User selectById(String id);@Delete(value = "delete from user where id = #{id}")@Options(useCache = false,flushCache = Options.FlushCachePolicy.TRUE)User deleteById(String id);
}

application.yml

spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://issavior-aliyun-rds.mysql.rds.aliyuncs.com:3306/test?useUnicode=true&charsetEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=trueusername: rootpassword: rootmybatis:configuration:# 驼峰大小写经典 Java 属性名 aColumn 的自动映射,默认值为falsemap-underscore-to-camel-case: true# statement: 关闭一级缓存;session:开启一级缓存local-cache-scope: session# 开启二级缓存cache-enabled: true# 打印sqllog-impl: org.apache.ibatis.logging.stdout.StdOutImpl############### Sa-Token 配置 (文档: https://sa-token.cc) ##############
#sa-token:
#  # token名称 (同时也是cookie名称)
#  token-name: satoken
#  # token有效期,单位s 默认30, -1代表永不过期
#  timeout: 2592000
#  # token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
#  activity-timeout: -1
#  # 是否允许同一账号并发登录 (true时允许一起登录,false时新登录挤掉旧登录)
#  is-concurrent: true
#  # 在多人登录同一账号时,是否共用一个token (true时所有登录共用一个token,false时每次登录新建一个token)
#  is-share: true
#  # token风格
#  token-style: uuid
#  # 是否输出操作日志
#  is-log: false
http://www.khdw.cn/news/6903.html

相关文章:

  • 利用云服务器做网站外贸推广方式
  • 上海专业做网站电话企业推广策划方案
  • 河北建筑培训网实名认证奶盘seo伪原创工具
  • 企业网站的建设怎么收费爱站网长尾关键词
  • 企业电子商务网站开发解封后中国死了多少人
  • 长春市人力资源和社会保障局pc优化工具
  • vs可以做网站吗国内最新新闻大事
  • 昆明网站优化2022年最新热点素材
  • 重庆专业网站建设seo优化推荐
  • 龙华学校网站建设成都百度
  • 临沂网站建设那家好百度电话怎么转人工客服
  • 网页游戏网站建设免费网站注册com
  • 莱芜网站优化怎么做软件开发网
  • 小型IT网站开发公司seo网站推广公司
  • 雄安网站建设400多少钱免费网站在线客服软件
  • 劳务派遣做网站的好处东莞网络营销推广软件
  • 网站开发与app开发原理竞价托管一般要多少钱
  • 网站建设投标书 技术架构网站点击排名优化
  • 河津网站制作网络舆情信息
  • 机电类网站模板广东seo推广贵不贵
  • 网站百度不到验证码怎么办啊深圳seo外包
  • 济南网站设计公司线上推广的优势和好处
  • 企业网站视觉设计东莞网络推广代运营
  • 上海的网站设计公司企业站seo案例分析
  • 网站做支付功能难吗关键词搜索趋势
  • 天河做网站服务首码项目推广平台
  • 提高网站百度权重广州专业网络推广公司
  • 青岛开发网站广州最新发布最新
  • 有哪些企业网站平台百度指数爬虫
  • 网站建设中的形象满意指的是销售深圳做网站的