mysql ehcache_MyBatis使用Ehcache作为二级缓存

特别说明:由于二级缓存是基于Mapper的,当你在不同的mapper中查询了相同的数据,例如不同的Mapper中有多表查询时结果中有相同的数据,当其中一个Mapper进行插入更新缓存时,另一个并没有插入更新,那么使用两个mapper查询出来的数据会出现数据不一致的情况,所以MyBatis默认的二级缓存的实现方式需要慎用,也因此MyBatis的二级缓存都默认关闭。

主要步骤(基于springboot+mybatis)

1 导入依赖

org.mybatis.spring.boot

mybatis-spring-boot-starter

1.3.2

mysql

mysql-connector-java

5.1.8

org.mybatis.caches

mybatis-ehcache

1.1.0

2 开启全局缓存

d8d036b4f0ae

开启全局配置

3 配置ehcache.xml

注意:ehcache.xml必须放在classpath路径下,并且名字必须是ehcache.xml(因为CacheManager默认就是加载classpath路径下的ehcache.xml文件,当然也可以自己设置,这就需要自己继承EhcacheCache自己写逻辑)

maxElementsInMemory="10000"

maxElementsOnDisk="0"

eternal="true"

overflowToDisk="true"

diskPersistent="true"

timeToIdleSeconds="0"

timeToLiveSeconds="0"

diskSpoolBufferSizeMB="50"

diskExpiryThreadIntervalSeconds="120"

memoryStoreEvictionPolicy="LFU"

/>

name="user_cache"

maxElementsInMemory="5000"

overflowToDisk="false"

diskPersistent="true"

timeToIdleSeconds="1800"

timeToLiveSeconds="1800"

memoryStoreEvictionPolicy="LRU"/>

这里最重要的就是默认缓存配置,因为CacheManager.addCache(name)添加的缓存就是通过默认配置创建的,具体每个属性代表的意思可以查询Ehcache的属性配置,网上很多,这里不细述。

4 在mapper中开启缓存并指定使用Ehcache

在一个mapper中通过以下代码添加缓存。

假设通过引入缓存的mapper的namespache为“com.dahuici.zyb.Dao.UserDao”,其他mapper可以通过如下标签与其共享缓存。

通过与配合使用,可以让所有的mapper都共用一个缓存。

特别提示,如果使用的是mybatis-plus,使用上面的步骤配置的话,会发现调用mybatis-plus已经封装好的api,缓存无效,只有自己在mapper中定义的sql方法才有效。个人理解就是这些api是mybatis-plus自己封装好的,封装的时候没有开启缓存,解决办法是如下,在dao层使用注解引用其他mapper的缓存,共享缓存

d8d036b4f0ae

mybatis-plus共享缓存

EhcacheCache源代码研究

public class EhcacheCache extends AbstractEhcacheCache {

public EhcacheCache(String id) {

super(id);

if (!CACHE_MANAGER.cacheExists(id)) {

//根据默认配置创建缓存

CACHE_MANAGER.addCache(id);

}

this.cache = CACHE_MANAGER.getEhcache(id);

}

}

对于mybatis,也可以自定义缓存,只需实现org.apache.ibatis.cache接口,需要注意的是必须要有一个传入String类型的一个构造方法,mybatis会自动调用并将namespace的值作为id传入。

package org.apache.ibatis.cache;

import java.util.concurrent.locks.ReadWriteLock;

public interface Cache {

//获取缓存id

String getId();

//往缓存中放入对象

void putObject(Object key, Object value);

//获取对象

Object getObject(Object key);

//移除对象

Object removeObject(Object key);

//清除缓存数据

void clear();

//获取缓存尺寸

int getSize();

//获取读写锁

ReadWriteLock getReadWriteLock();

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245427.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

yii3正式版什么时候发布_华为mate50pro什么时候发布

阅读本文前,请您先点击上面的蓝色字体,再点击“关注”,这样您就可以继续免费收到文章了。每天都有分享,完全是免费订阅,请放心关注。 …

shiro如何保证session不失效_请问在不加锁的情况下如何保证线程安全?

概念compare and swap,解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数——内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器…

externalreferences 命令在 sdi 模式下不可用_一个适合新手交互式Git命令学习项目

前言在我们日常工作开发中,Git是必不可少的版本控制软件,很多时候我们都用Git来管理我们的项目。比较常用的有Github,Gitlab,Stash等。因此对于Git命令的掌握是我们工作必备的能力。今天分享一个Git命令学习项目:learn…

sqlyong 删除数据能否撤回_数据结构知识点总结

some quoted by Fundebug:代码面试需要知道的8种数据结构(附面试题及答案链接)​zhuanlan.zhihu.comadded with other sources8 种常用数据结构数组栈队列链表图树哈希表priorityqueue1. 数组数组(Array)大概是最简单,也是最常用的数据结构了。其他数据结…

matlab 点云特征_基于点云的3D障碍物检测

击上方“新机器视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达基于点云的3D障碍物检测主要有以下步骤:点云数据的处理基于点云的障碍物分割障碍物边框构建点云到图像平面的投影点云数据的处理KITTI数据集KITTI数据集有四个相…

重定义 不同的基类型_镍及铁镍基耐蚀合金高温合金哈氏合金镍基合金之第一篇概述...

纯镍是一种重要的应用于工业的原材料,它除具有良好 的强度、塑韧性外,在卤族元素及其氢化物活泼性气体、苛 性介质、不含氧和氧化剂的还原性酸介质中还具有良好的耐 蚀性,因此纯镍作为耐蚀金属材料得到广泛应用。此外,由 于提高耐…

cad统计面积长度插件vlx_用了它,画cad施工图再也不加班了!

文尾左下角阅读原文看视频教程好课推荐:1、CAD2014:点击查看 2、室内CAD:点击查看 3、CAD2019:点击查看4、CAD2018:点击查看5、Bim教程:点击查看6、室内手绘:点击查看7、CAD三维:点击…

mysql 视图 查询速度慢_mysql 视图查询速度慢

场景:表 stockpooldata_flashCREATE TABLE stockpooldata_flash (id bigint(15) NOT NULL AUTO_INCREMENT,formula_id int(8) DEFAULT NULL,period_type tinyint(3) DEFAULT NULL,gpMarket int(4) DEFAULT NULL,gpcode varchar(20) DEFAULT NULL,ymd int(11) DEFAUL…

局部页面切换url为什么不变_python爬虫 - 翻页url不变网页的爬虫探究

python爬虫-翻页url不变网页的爬虫探究url随着翻页改变的爬虫已经有非常多教程啦,这里主要记录一下我对翻页url不变网页的探究过程。学术菜鸡第一次写CSDN,请大家多多包容~ 如果对你有一点点帮助,请帮我点个赞吧!翻页u…

python波峰波谷算法_波动均分算法

波动均分算法by leeenx on 2018-01-11「波动」和「均分」大部分读者朋友是知道的,但看到「波动均分」应该是一头雾水的。其实,这个名词是笔者拼凑出来的。什么是「波动均分」?把指定的数值 A,分成 N 份,此时每份的数值…

java web 注册登录_javaweb实现登录注册功能实例

前期呢,我们学习了javaweb项目用JDBC连接数据库,还有数据库的建表功能,今天,我们来看一下javaweb实现登录注册功能实例,javaweb项目使用的工具是eclipse,最后把项目部署在了Tomcat中,连接数据库…

source insight 函数不能跳到definition_小技能: Windows10突然不能复制粘贴谁搞鬼

最近连续遇到几次,电脑突然不能复制粘贴了,非常影响工作。(如果不想听我扯,就直接跳到最后看结果啊,我真贴心。)你们都懂得,程序员嘛,用的最多的就是ctrlc,ctrlv。这不能用了,不是让…

hsv 明度的范围_通过HSV转换的方式实现图片数据增强

在我的上一篇文章中,我记录了自己将MOT17-Det数据集转换成VOC格式:HUST小菜鸡:将MOT17-Det数据集转成VOC格式​zhuanlan.zhihu.com但是在后期的测试过程中,发现了一些小问题:首先是train.txt里面写入的图片数和标注的数…

java protected关键字_Java 权限protected关键字纠正

以前一直认为自己理解了Java四种权限访问,昨天突然编程时发现protected居然在子类中不能调用,然后越看越迷糊??????public: Java语言中访问限制最宽的修饰符,…

互联网java常用框架_来,带你鸟瞰 Java 中4款常用的并发框架!

1. 为什么要写这篇文章几年前 NoSQL 开始流行的时候,像其他团队一样,我们的团队也热衷于令人兴奋的新东西,并且计划替换一个应用程序的数据库。 但是,当深入实现细节时,我们想起了一位智者曾经说过的话:“细…

2020亚太杯数学建模_比赛 | 2020年APMCM亚太地区大学生数学建模竞赛

2020年11月26日到30日,在我院老师指导下,由统计分析竞赛社组织的41支队伍,共123人,参加了亚太地区大学生数学建模竞赛组委会主办的大学生学科类竞赛。此次竞赛题目分为A题和B题,参赛者需从A,B两题中任选其一…

java声明复数类_JAVA声明复数类

声明复数类,成员变量包括实部和虚部,成员方法包括实现由字符串构造复数、复数加法、减法,字符串描述、比较相等等操作。虽然我只是一个刚学一个月JAVA的菜鸡,但是强迫症让我把复数乘法和除法一起写出来了。public class Complex {…

sql 没有调试 菜单_MySQL递归查询上下级菜单

正文在传统的后台管理系统里面经常会需要展示多级菜单关系,今天我们来学一下如何使用一条SQL语句展示多级菜单。现在我们有一张corpinfo单位表,里面有一个belong字段指向上级单位,首先来看一下现在表里有什么数据:SELECT uid,ubel…

java 桥 word_java导出word的6种方式(转发)

最近做的项目,需要将一些信息导出到word中。在网上找了好多解决方案,现在将这几天的总结分享一下。目前来看,java导出word大致有6种解决方案:1:Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构…

jieba 词典 词频_在Hanlp词典和jieba词典中手动添加未登录词

在使用Hanlp词典或者jieba词典进行分词的时候,会出现分词不准的情况,原因是内置词典中并没有收录当前这个词,也就是我们所说的未登录词,只要把这个词加入到内置词典中就可以解决类似问题,如何操作呢,下面我…