好久没有写过博客了,这段时间一直在准备软考,没有抽出空来写博客,今天呢,给大家分享一个缓存技术吧,不是基于redis的缓存,而是二级mybits自带的二级缓存。

缓存,从字面上就知道是将已经访问过的网页缓存在内存中,当下一次访问的时候不需要发送sql请求到数据库,而是直接在内存里面取。对于一些很小修改的数据库来说,是减轻数据库压力的一种有效方法,而redis虽然是最流行的缓存技术,但是由于博主经验不够,这里就不讲如何配置了。

unbtu mysql二级制文件 mysql的二级缓存_unbtu mysql二级制文件

献上一张图,是关于二级缓存的原理的,二级缓存的级别是一个个mapper,对应数据库的一张表,当第一次访问某条数据库记录时,记录会被加入缓存,当重新请求获取该记录时直接从缓存里取,当然,为了防止读取脏数据,当进行插入、更新、删除的时候会清除所有的缓存,这是粗颗粒的缓存,因为一旦有修改,就要删除所有的缓存。如果缓存里不存在,则会去数据库里取,这便是缓存的原理,减轻了数据库的压力。

大家肯定最关注的还是如何使用二级缓存,mybits默认是关闭二级缓存的,步骤有三个:

1.开启二级缓存开关:mybits的配置文件中

unbtu mysql二级制文件 mysql的二级缓存_缓存_02

 

2.Mapper映射文件中添加一行:  <cache /> ,表示此mapper开启二级缓存。

mybatis的cache参数只适用于mybatis维护缓存。

flushInterval(刷新间隔)可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。

size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的可用内存资源数目。默认值是1024。

3.序列化

mybatis二级缓存需要将查询结果映射的pojo实现 java.io.serializable接口,如果不实现则抛出异常:

org.apache.ibatis.cache.CacheException: Error serializing object.  Cause: java.io.NotSerializableException: cn.itcast.mybatis.po.User

二级缓存可以将内存的数据写到磁盘,存在对象的序列化和反序列化,所以要实现java.io.serializable接口。

如果结果映射的pojo中还包括了pojo,都要实现java.io.serializable接口。

配置完成

来看看debug模式下的一条日志信息

可以看到显示cache命中率为0.5,表示成功开启cache。