清空缓存_MyBatis缓存和注解

本文详细介绍了MyBatis的一级和二级缓存机制,包括缓存的开启、配置以及缓存策略。同时,文章还探讨了MyBatis的注解使用,包括@Insert、@Update等,以及@Results、@Result、@One和@Many等结果映射注解。
摘要由CSDN通过智能技术生成

Mybatis缓存和注解

学习目标

1、mybatis缓存

2、mybatis注解

学习内容

1、mybatis缓存

如何提高查询的效率?

缓存技术:第一次查询到的数据缓存到内存中,后续再次进行相同的查询时,可以直接存内存中取数据。

mybatis缓存解决方案:

一级缓存:

一级缓存默认开启的,基于SqlSession级别的缓存,每一个sqlsession之间是相互独立的。

当SqlSession执行:关闭、更新操作(增删改)、清空缓存操作时:会清空缓存;

2456327838191b29bbd5e80c8e93a39f.png

示例:

 @Test public void test1(){ SqlSession session= SessionFactory.getSession(); //接口绑定 EmpDao dao= session.getMapper(EmpDao.class); List list=dao.queryAll(); System.out.println(list); List list2=dao.queryAll(); System.out.println(list2); session.close(); }

二级缓存:

基于Application级别的缓存。操作:对应到每一个mapper(文件)

8af2d0be7e51f0332fc82580d4cf3b6f.png

实现二级缓存步骤:

1、开启二级缓存

二级缓存默认不开启,需要在全局配置文件中开启:

  

2、在对应的mapper文件中设置:

 

基本上就是这样。这个简单语句的效果如下:

  • 映射语句文件中的所有 select 语句的结果将会被缓存。
  • 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
  • 缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。
  • 缓存不会定时进行刷新(也就是说,没有刷新间隔)。
  • 缓存会保存列表或对象(无论查询方法返回哪种)的 1024 个引用。
  • 缓存会被视为读/写缓存,这意味着获取到的对象并不是共享的,可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改

详细设置如下:

1、eviction:清除策略

可用的清除策略有:

  • LRU – 最近最少使用:移除最长时间不被使用的对象。
  • FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
  • SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。
  • WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象

2、flushInterval(刷新间隔)属性可以被设置为任意的正整数,设置的值应该是一个以毫秒为单位的合理时间量。 默认情况是不设置,也就是没有刷新间隔,缓存仅仅会在调用语句时刷新。

3、size(引用数目)属性可以被设置为任意正整数,要注意欲缓存对象的大小和运行环境中可用的内存资源。默认值是 1024。

4、readOnly(只读)属性可以被设置为 true 或 false。只读的缓存会给所有调用者返回缓存对象的相同实例。 因此这些对象不能被修改。这就提供了可观的性能提升。而可读写的缓存会(通过序列化)返回缓存对象的拷贝。 速度上会慢一些,但是更安全,因此默认值是 false。

提示 二级缓存是事务性的。这意味着,当 SqlSession 完成并提交时,或是完成并回滚,但没有执行 flushCache=true 的 insert/delete/update 语句时,缓存会获得更新。

3、需要缓存的实体类要实现序列化接口

实体类 implements Serializable 

4、测试

 @Test public void test1(){ SqlSession session= SessionFactory.getSession(); //接口绑定 EmpDao dao= session.getMapper(EmpDao.class); //一次 List list=dao.queryAll(); System.out.println(list); session.close(); //提交事务 session= SessionFactory.getSession(); //接口绑定 dao= session.getMapper(EmpDao.class); List list2=dao.queryAll(); System.out.println(list2); //session.clearCache();//清空缓存 session.close(); }

注意:

只能对单表进行缓存。

在不同的标签上可以设置是否使用缓存:

自定义二级缓存:

1、创建缓存类需要实现cache接口

public interface Cache { String getId(); int getSize(); void putObject(Object key, Object value); Object getObject(Object key); boolean hasKey(Object key); Object removeObject(Object key); void clear();}

2、设置

基于ehcache实现二级缓存:

echache:

EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider.

是java范围内使用最广泛的缓存。同时它也支持分布式缓存。也提供了磁盘,内存的缓存存储

操作步骤:

1、引入依赖

  org.mybatis.caches mybatis-ehcache 1.0.3

2、设置:ehcache.xml

放到resources根目录下:

属性说明如下:

  • diskStore
  • diskStore元素:指定一个路径,当EHCache把数据写到硬盘上的时候,会把数据写到该目录下。
  • defaultCache:设定缓存的默认数据过期策略。
  • maxElementsInMemory:设置基于内存的缓存可存放对象的最大数目;
  • maxElementOnDisk:设置基于硬盘的缓存可存放对象的最大数目;
  • eternal:如果为true,表示对象永远不会过期,此时会忽略tiemToldleSeconds和timeToLiveSeconds属性
  • 默认为false。
  • timeToldleSeconds:设置允许对象处于空闲状态的最长时间,以秒为单位。当对象最近一次被访问后,如果处于空闲状态的时间超过了;timeToldleSeconds属性值,这个对象就会过期。
  • timeToLiveSeconds:必须大于timeToldleSeconds属性,才有意义;
  • 当对象自从被存放到缓存中后,如果处于缓存中的时间超过了 timeToLiveSeconds属性值,
  • 这个对象就会过期,EHCache将把它从缓存中清除;即缓存自创建日期起能够存活的最长时间,单位为秒(s)
  • overflowToDisk:如果为true,表示当基于内存的缓存中的对象数目达到了maxElementsInMemory界限后会把溢出的对象写到基于硬盘的缓存中。
  • 注意,如果缓存的对象要写入到硬盘中的话,则该对象必须实现了Serializable接口才行(也就是序列化);
  • memoryStoreEvictionPolicy
  • 缓存对象清除策略。
  • 有三种:
  • FIFO:first in first out
  • 先进先出。
  • LFU:Less Frequently Used
  • 一直以来最少被使用策略,缓存元素有一个hit属性,hit(命中)值最小的将会被清除出缓存。
  • LRU:least Recenly used
  • 最近最少被使用,缓存的元素有一个时间戳,当缓存的容量满了,而又需要腾出地方来缓存新的元素的时候,
  • 那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
  • maxElementsOnDisk:在DiskStore(磁盘存储)中的最大对象数量,如为0,则没有限制
  • diskPersistent:否disk store在虚拟机启动时持久化。默认为false
  • diskExpiryThreadIntervalSeconds
  • Ehcache后台线程专门做Ellment失效监测以及清除工作。此值不宜设置过低,否则会导致清理线程占用大量CPU资源。默认值是120秒。

3、设置cache标签:

源码查看 :

74b76286fdf4cd822221979909209a83.png

测试(略)

2、mybatis注解

常用注解:

  • @Insert: 对应标签:insert
  • @Update :对应标签:update
  • @Delete:对应标签:delete
  • @Select :对应标签: select

说明:这四个注解分别代表将会被执行的 SQL 语句。它们用字符串数组(或单个字符串)作为参数。如果传递的是字符串数组,字符串之间先会被填充一个空格再连接成单个完整的字符串。这有效避免了以 Java 代码构建 SQL 语句时的“丢失空格”的问题。然而,你也可以提前手动连接好字符串。属性有:value,填入的值是用来组成单个 SQL 语句的字符串数组

  • @Results:对应ResultMap

结果映射的列表,包含了一个特别结果列如何被映射到属性或字段的详情。属性有:value, id。value 属性是 Result 注解的数组。这个 id 的属性是结果映射的名称./

  • @Result:对应result和id

在列和属性或字段之间的单独结果映射。属性有:id, column, javaType, jdbcType, typeHandler, one, many。id 属性是一个布尔值,来标识应该被用于比较(和在 XML 映射中的相似)的属性。one 属性是单独的联系,和 相似,而 many 属性是对集合而言的,和相似。它们这样命名是为了避免名称冲突

  • @One:对应association

复杂类型的单独属性值映射。属性有:select,已映射语句(也就是映射器方法)的全限定名,它可以加载合适类型的实例。fetchType会覆盖全局的配置参数 lazyLoadingEnabled。

注意 联合映射在注解 API中是不支持的。这是因为 Java 注解的限制,不允许循环引用

  • @Many:collection

映射到复杂类型的集合属性。属性有:select,已映射语句(也就是映射器方法)的全限定名,它可以加载合适类型的实例的集合,fetchType 会覆盖全局的配置参数 lazyLoadingEnabled。

注意联合映射在注解 API中是不支持的。这是因为 Java 注解的限制,不允许循环引用

  • @MapKey:

这是一个用在返回值为 Map 的方法上的注解。它能够将存放对象的 List 转化为 key 值为对象的某一属性的 Map。属性有: value,填入的是对象的属性名,作为 Map 的 key 值

  • @CacheNamespace:对应cache标签

为给定的命名空间(比如类)配置缓存。属性有:implemetation, eviction, flushInterval, size, readWrite, blocking 和properties

示例:

public interface DeptAnnoDao { @Insert("insert into .... ") int insert(Dept dept); @Select("select * from dept") @Results(id="dept1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值