专栏首页Spring相关mybatis开启二级缓存小记

mybatis开启二级缓存小记

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:\develop\ehcache" /> 
    <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(先进先出)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Mysql插入中文的字段内容时乱码的解决方法

    我们需要更改改动mysql配置文件/etc/my.cnf并加入如下的参数。(Linux环境下)

    Dream城堡
  • 部分算法总结

    希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效...

    Dream城堡
  • Mysql查询一段时间记录

    $sql="SELECT video_id,count(id)as n FROM rec_down WHERE UNIX_TIMESTAMP(NOW())-UN...

    Dream城堡
  • Ehcache介绍及整合Spring实现高速缓存

    Ehcache介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。它使用的是J...

    Java技术栈
  • 如果有人问你 JFinal 如何集成 EhCache,把这篇文章甩给他

    废话不多说,就说一句:在 JFinal 中集成 EhCache,可以提高系统的并发访问速度。

    沉默王二
  • MyBatis学习总结(七)——Mybatis缓存

    一枝花算不算浪漫
  • django 三种缓存模式的使用及注意点

        @cache_control,@vary_on_headers,@vary_on_cookie 

    用户1558882
  • django 三种缓存模式的使用及注意点

        @cache_control,@vary_on_headers,@vary_on_cookie 

    用户1558882
  • 国内一个款不错的二级缓存框架J2Cache

    缓存技术在软件开发中已经无处不在,今天分享一款国内开源的相当不错的缓存框架J2Cache 。J2Cache 是 OSChina 目前正在使用的两级缓存框架(要求...

    java乐园
  • 浏览器缓存机制

    解释:在用户浏览网络的时候,同一个域名下的网页大部分是有很多共同文件的,比如第三方js文件,css文件,所以我们不可能当用户每浏览一个网页或者刷新同一个网页时,...

    IT人一直在路上

扫码关注云+社区

领取腾讯云代金券