mybatis开启二级缓存小记

城南少年与猫      2022-04-14     616

关键词:

mybatis开启二级缓存小记

1.开启二级缓存

  和一级缓存默认开启不一样,二级缓存需要我们手动开启

  首先在全局配置文件 mybatis-configuration.xml 文件中加入如下代码:

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

  其次在 UserMapper.xml 文件中开启缓存

<!-- 开启二级缓存 -->
<cache></cache>

  我们可以看到 mapper.xml 文件中就这么一个空标签<cache/>,其实这里可以配置<cache type="org.apache.ibatis.cache.impl.PerpetualCache"/>,PerpetualCache这个类是mybatis默认实现缓存功能的类。我们不写type就使用mybatis默认的缓存,也可以去实现 Cache 接口来自定义缓存。

<cache type="org.apache.ibatis.cache.impl.PerpetualCache"></cache>

2.useCache和flushCache

  mybatis中还可以配置userCache和flushCache等配置项,userCache是用来设置是否禁用二级缓存的,在statement中设置useCache=false可以禁用当前select语句的二级缓存,即每次查询都会发出sql去查询,默认情况是true,即该sql使用二级缓存。

<select id="selectUserByUserId" useCache="false" resultType="com.ys.twocache.User" parameterType="int">    
select * from user where id=#{id}
</select>

  这种情况是针对每次查询都需要最新的数据sql,要设置成useCache=false,禁用二级缓存,直接从数据库中获取。

  在mapper的同一个namespace中,如果有其它insert、update、delete操作数据后需要刷新缓存,如果不执行刷新缓存会出现脏读。

  设置statement配置中的flushCache=”true” 属性,默认情况下为true,即刷新缓存,如果改成false则不会刷新。使用缓存时如果手动修改数据库表中的查询数据会出现脏读。

<select id="selectUserByUserId" flushCache="true" useCache="false" resultType="com.ys.twocache.User" parameterType="int">    

select * from user where id=#{id}

</select>

  一般下执行完commit操作都需要刷新缓存,flushCache=true表示刷新缓存,这样可以避免数据库脏读。所以我们不用设置,默认即可。

3.二级缓存整合ehcache

在全局配置文件 mybatis-configuration.xml 开启缓存

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

  

 在 xxxMapper.xml 文件中整合 ehcache

  将如下的类的全类名写入<cache type="" ></cache>的type属性中

<!-- 开启本mapper的namespace下的二级缓存 type:指定cache接口的实现类的类型,不写type属性,mybatis默认使用PerpetualCache 要和ehcache整合,需要配置type为ehcache实现cache接口的类型 -->
<cache type= "org.mybatis.caches.ehcache.EhcacheCache" ></cache>

  

  配置缓存参数

  在 classpath 目录下新建一个 ehcache.xml 文件,并增加如下配置:

<?xml version="1.0" encoding= "UTF-8" ?> <ehcache xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "../config/ehcache.xsd" >
    <diskStore path= "F:developehcache" /> 
    <defaultCache maxElementsInMemory= "10000" eternal= "false"            timeToIdleSeconds= "120" timeToLiveSeconds= "120" maxElementsOnDisk= "10000000"             diskExpiryThreadIntervalSeconds= "120" memoryStoreEvictionPolicy= "LRU"> <persistence strategy= "localTempSwap" /> 
    </defaultCache>
    </ehcache>

  

diskStore:指定数据在磁盘中的存储位置。
defaultCache:当借助CacheManager.add("demoCache")创建Cache时,EhCache便会采用<defalutCache/>指定的的管理策略
以下属性是必须的:
maxElementsInMemory - 在内存中缓存的element的最大数目
maxElementsOnDisk - 在磁盘上缓存的element的最大数目,若是0表示无穷大
eternal - 设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断
overflowToDisk - 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上
以下属性是可选的:
timeToIdleSeconds - 当缓存在EhCache中的数据前后两次访问的时间超过timeToIdleSeconds的属性取值时,这些数据便会删除,默认值是0,也就是可闲置时间无穷大
timeToLiveSeconds - 缓存element的有效生命期,默认是0.,也就是element存活时间无穷大
diskSpoolBufferSizeMB 这个参数设置DiskStore(磁盘缓存)的缓存区大小.默认是30MB.每个Cache都应该有自己的一个缓冲区.
diskPersistent - 在VM重启的时候是否启用磁盘保存EhCache中的数据,默认是false。
diskExpiryThreadIntervalSeconds - 磁盘缓存的清理线程运行间隔,默认是120秒。每个120s,相应的线程会进行一次EhCache中数据的清理工作
memoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略。默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出)

mybatis二级缓存默认开启吗?

参考技术A不是,一级缓存默认开启,二级需要配置文件设置。 查看详情

mybatis缓存

mybatis的延迟加载和缓存技术开始 mybatis一级缓存  mybatis的二级缓存mybatis默认是没有开启二级缓存的。 开启二级缓存需要在mybatis的全局配置文件sqlMapConfig.xml中加入 除了开启二级缓存开关外,还需要在各自的map... 查看详情

23mybatis学习——mybatis的二级缓存

MyBatis一级缓存最大的共享范围就是一个SqlSession内部,那么如果多个SqlSession需要共享缓存,则需要开启二级缓存,开启二级缓存后,会使用CachingExecutor装饰Executor,进入一级缓存的查询流程前,先在CachingExecutor进行二级缓存的查... 查看详情

mybatis学习记录5mybatis的二级缓存

 主题  之前学习了一下MyBatis的一级缓存,主要涉及到BaseExecutor这个类.现在准备学习记录下MyBatis二级缓存. 配置二级缓存与初始化发生的事情首先二级缓存默认是不开启的,需要自己配置开启.如上图,需要在configuration里去... 查看详情

mybatis的一二级缓存,一级缓存默认开启(代码片段)

1.可以知道的是Mybatis的一级缓存SqlSession默认是开启的。2.可以自己去开启二级缓存在config.xml文件中的properties下面可以加上这个配置:<settings><!--进行懒加载--><settingname="lazyLoadingEnabled"value="false" 查看详情

mybatis——一级缓存二级缓存

一、Mybatis缓存●MyBatis包含一个非常强大的查询緩存特性,它可以非常方便地定制和配置缓存。绶存可以极大的提升查询效率。●MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存  ○ 默认情况下,只有一级缓存开启... 查看详情

mybatis缓存

一、mybatis里面有一级缓存,默认开启的,缓存到sqlSession,二级缓存要手动开启,sqlSessionFactory   一级缓存只要session不关闭,使用session去查询同一个对象,就只会执行一条sql。二、开启二级缓存,mybatis核心配置<!--启用二... 查看详情

mybatis怎么开启二级缓存

参考技术A深入了解MyBatis二级缓存一、创建Cache的完整过程我们从SqlSessionFactoryBuilder解析mybatis-config.xml配置文件开始:Readerreader=Resources.getResourceAsReader("mybatis-config.xml");SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(... 查看详情

mybatis集成redis作为二级缓存

mybatis默认开启了二级缓存功能,在mybatis主配置文件中,将cacheEnabled设置成false,则会关闭二级缓存功能<settings><!--二级缓存默认开启,false关闭--><settingname="cacheEnabled"value="false"/><!--mybatis日志打印到控制台--><set... 查看详情

mybatis二级缓存详解(代码片段)

1 二级缓存简介二级缓存是在多个SqlSession在同一个Mapper文件中共享的缓存,它是Mapper级别的,其作用域是Mapper文件中的namespace,默认是不开启的。看如下图: 整个流程是这样的(不考虑第三方缓存库):当开启二级缓存... 查看详情

mybatis一级缓存与二级缓存

MyBatis一级缓存  MyBatis一级缓存默认开启,一级缓存为Session级别的缓存,在执行以下操作时一级缓存会清空  1.执行session.clearCache();  2.执行CUD操作  3.session.close();//不是同一个Session对象了 MyBatis二级缓存  需要配... 查看详情

mybatis缓存

mybatis默认开启一级缓存。开启二级缓存也很简单,只需要将POJO实现Serializable接口,并在映射文件以及mybatis配置文件开启二级缓存即可。 1、一级缓存的作用域是SqlSession范围,当在同一个sqlSession两次调用同一个Mapper方法时,... 查看详情

mybatis缓存之二级缓存

二级缓存(全局缓存):基于namespace级别的缓存,一个namespace对应一个二级缓存。工作机制:一个会话,查询一条数据,这条数据会放在当前会话的一级缓存中;如果会话关闭,该会话对应的一级缓存就消失了;可以使用二级缓... 查看详情

mybatis缓存

MyBatis缓存MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存默认情况下,只有一级缓存开启。(SqlSession级别的... 查看详情

mybatis自带一级和二级缓存,为啥还要用redis

二级缓存是namespace区域内的,所以不同的namespace下操作同一张表,会导致数据不一致,个人从未使用过二级缓存,redis更灵活,功能更丰富参考技术A总配置文件中,二级缓存也是开启的,不需要设置<settingname="cacheEnabled"... 查看详情

使用redis做mybaties的二级缓存-mybatis二级缓存小心使用

 Mybatis默认对二级缓存是关闭的,一级缓存默认开启;下面就说说为什么使用二级缓存需要注意:    二级缓存是建立在同一个namespace下的,如果对表的操作查询可能有多个namespace,那么得到的数据就是错误的... 查看详情

mybatis缓存

基本概念一级缓存与session绑定,只存在于session生命周期内,从数据库中查询到的值会保存到一级缓存中,当session关闭后,会保存到二级缓存中,一级缓存默认是开启的。二级缓存存在于sqlSessionFactory生命周期内,多个session共享... 查看详情

mybatis三

1Mybatis的缓存1.1Mybatis的缓存机制Mybatis包含非常求昂达的查询缓存特性,它可以非常方便的配置和定制。缓存可以极大的提高查询效率。 Mybatis系统中默认定义了一级缓存和二级缓存。①默认情况下,只有一级缓存开启。②二... 查看详情