Mybatis缓存(一级缓存、二级缓存)

Mybatis缓存(一级缓存、二级缓存)

Mybatis缓存分为一级缓存、二级缓存。Mybatis一级缓存默认是开启的;二级缓存全局开关默认也是开启的,但需要配置CacheNamespace才可生效!
以Mybatis-plus为例

mybatis-plus:
  mapper-locations: classpath*:mapper/*.xml
  configuration:
    log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
    default-statement-timeout: 300
    # mybatis二级缓存全局开关
    cache-enabled: true
    # mybatis一级缓存作用域(session、statement)
    local-cache-scope: session

一、Mybatis一级缓存

1.缓存模式为只读模式,返回对象本身而非副本;
2.无法禁用,但可通过local-cache-scope: statement调整作用范围;作用域为statement“等效”于禁用(一个statement可包含多个SQL,此时无法完全禁用)。

二、Mybatis二级缓存

1.缓存模式默认为读写模式,返回对象副本(对象序列化),可设置readWrite属性进行调整。
@CacheNamespace(flushInterval = 600000, size = 4096, readWrite = true)
2.可禁用
mybatis-plus:
  configuration:
    # mybatis二级缓存全局开关
    cache-enabled: false

缓存默认实现类:org.apache.ibatis.cache.impl.PerpetualCache

  • PerpetualCache使用本地内存(集群模式下慎用);
  • 使用装饰者设计模式,为缓存类提供更加丰富的功能org.apache.ibatis.mapping.CacheBuilder#setStandardDecorators。
3.自动刷新缓存

同一namespace下修改、删除数据时,缓存自动刷新。刷新其它namespace下缓存,使用@CacheNamespaceRef注解。

4.手动刷新缓存
package com.example.demo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.CommParamDefEntity;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Select;

/**
 * @author ouruyi
 */
public interface CommonMapper extends BaseMapper<CommParamDefEntity> {
    /**
     * 刷新Mybatis二级缓存(一级缓存也会刷新)
     * @return 'x'
     */
    @Options(useCache = false, flushCache = Options.FlushCachePolicy.TRUE)
    @Select("SELECT 'x' AS X FROM DUAL")
    String flushCache();
}

三、性能调优

  • 避免动态参数作为查询参数;例如当前系统时间作为查询参数导致mybatis缓存失效;
  • redis null值击穿
  • 冷热数据分离,不建议将冷数据放到缓存,防止缓存被占满。(LRU)
  • 合适的日志实现类
mybatis-plus:
  configuration:
  	# 此处为mybatis-plus通过system.out输出日志到控制台,影响性能(禁用可提升数倍)
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

改为:

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
  • 连接池配置
druid:
  filters: stat,config
  min-idle: 10
  max-active: 100
  max-pool-prepared-statement-per-connection-size: 20
  min-evictable-idle-time-millis: 300000
  initial-size: 10
  max-wait: 60000
  time-between-eviction-runs-millis: 120000
  pool-prepared-statements: true
  # 高并发性能低
  test-on-borrow: false
  test-on-return: false
  test-while-idle: true
  # 持活,检测间隔默认1分钟(不宜超过3分钟,华为防火墙跨网段切断空闲连接时限3分钟)
  keep-alive: false
  validation-query: SELECT 'x' FROM DUAL
  # 校验超时1秒
  validation-query-timeout: 1
  • 合适的线程池、数据库连接池
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬山境KL攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值