MyBatis关于二级缓存问题

发布时间 - 2026-01-11 00:19:58    点击率:

MyBatis提供一级缓存和二级缓存,其中一级缓存是sqlSession级别的缓存,不同的sqlSession之间的缓存互不影响。二级缓存是Mapper级别的缓存,多个sqlSession操作同一个Mapper,其二级缓存是可以共享的。

MyBatis有多种二级缓存方案可供选择。其中对Memcached的支持较为成熟,现以Memcached为例介绍与spring项目的集成。

使用配置

配置pom.xml,添加依赖。

<dependencies>
 ...
 <dependency>
  <groupId>org.mybatis.caches</groupId>
  <artifactId>mybatis-memcached</artifactId>
  <version>1.0.0</version>
 </dependency>
 ...
</dependencies>

全局开关

<settings>
  <setting name="cacheEnabled" value="true"/>
</settings>

配置需要缓存的mapper.xml

二级缓存是Mapper级别的,可以针对具体的mapper.xml开启二级缓存。

<mapper namespace="org.acme.FooMapper">
 <cache type="org.mybatis.caches.memcached.MemcachedCache" />
</mapper>

开启后,则mapper中所有的select语句默认都将被缓存,此命名空间下所有insert、update、delete语句将会导致空间下的缓存被清空。

可以针对具体某条语句禁用缓存。

 <select id="retObj" resultMap="results" useCache="false" >
   select id, name, sex from employee  
 </select>

也可针对某条语句触发刷新动作(默认对应所有插入、更新、删除语句)。

 <select id="retObj" resultMap="results" flushCache="true" >
   select id, name, sex from employee  
 </select>

配置参数在memcached.properties中设置,如果缺失则使用缺省设置。

以下是配置参数:

如果需要记录cache操作日志,可由如下配置实现

<mapper namespace="org.acme.FooMapper">
 <cache type="org.mybatis.caches.memcached.LoggingMemcachedCache" />
 ...
</mapper>

注意事项

缓存在Memcached中的类需要实现Serializable接口,否则会报错java.io.NotSerializableException。

二级缓存应用场景

  1. 对查询频率高,变化频率低的数据建议使用二级缓存。
  2. 对于访问多的查询请求且用户对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度,业务场景比如:耗时较高的统计分析sql、电话账单查询sql等。

实现方法如下:

通过设置刷新间隔时间,由mybatis每隔一段时间自动清空缓存,根据数据变化频率设置缓存刷新间隔flushInterval,比如设置为30分钟、60分钟、24小时等,根据需求而定。

mybatis局限性

mybatis二级缓存对细粒度的数据级别的缓存实现不好。

比如如下需求:对商品信息进行缓存,由于商品信息查询访问量大,但是要求用户每次都能查询最新的商品信息,此时如果使用mybatis的二级缓存就无法实现当一个商品变化时只刷新该商品的缓存信息而不刷新其它商品的信息,因为mybaits的二级缓存区域以mapper为单位划分,当一个商品信息变化会将所有商品信息的缓存数据全部清空。解决此类问题需要在业务层根据需求对数据有针对性缓存。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# MyBatis  # 二级缓存  # mybatis二级缓存原理  # 深入理解MyBatis中的一级缓存与二级缓存  # 深入理解Mybatis二级缓存  # 详解Mybatis的二级缓存配置  # mybatis二级缓存的实现代码  # Mybatis如何通过注解开启使用二级缓存  # MyBatis中一级缓存和二级缓存的区别  # 在分布式环境下正确使用MyBatis二级缓存的最佳实践  # 清空  # 多个  # 将会  # 都能  # 较高  # 也可  # 而不  # 不高  # 此类  # 将被  # 为例  # 报错  # 量大  # 设置为  # 会将  # 而定  # 信息查询  # 中对  # 每隔  # 则会 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  Python进程池调度策略_任务分发说明【指导】  详解Android中Activity的四大启动模式实验简述  音响网站制作视频教程,隆霸音响官方网站?  打造顶配客厅影院,这份100寸电视推荐名单请查收  JS去除重复并统计数量的实现方法  Laravel如何实现一对一模型关联?(Eloquent示例)  什么是javascript作用域_全局和局部作用域有什么区别?  如何在景安云服务器上绑定域名并配置虚拟主机?  如何在IIS中新建站点并配置端口与物理路径?  如何在IIS管理器中快速创建并配置网站?  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  Laravel怎么连接多个数据库_Laravel多数据库连接配置  如何在七牛云存储上搭建网站并设置自定义域名?  如何用VPS主机快速搭建个人网站?  LinuxCD持续部署教程_自动发布与回滚机制  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  太平洋网站制作公司,网络用语太平洋是什么意思?  如何用wdcp快速搭建高效网站?  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  如何在服务器上配置二级域名建站?  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  高防服务器租用指南:配置选择与快速部署攻略  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  实现点击下箭头变上箭头来回切换的两种方法【推荐】  网站制作报价单模板图片,小松挖机官方网站报价?  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  Laravel中的withCount方法怎么高效统计关联模型数量  如何在宝塔面板中创建新站点?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  Laravel如何创建自定义中间件?(Middleware代码示例)  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  *服务器网站为何频现安全漏洞?  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  如何彻底卸载建站之星软件?  音乐网站服务器如何优化API响应速度?  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  HTML 中如何正确使用模板变量为元素的 name 属性赋值  如何在万网主机上快速搭建网站?  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  香港服务器网站生成指南:免费资源整合与高速稳定配置方案