基础图解之mybatis的一级缓存和二级缓存

参考博客:html

spring管理hibernate,mybatis,一级缓存失效缘由

https://www.cnblogs.com/zhangyu0217----/p/7574704.htmlspring

Mybatis和mybatis-spring一级缓存

http://www.javashuo.com/article/p-ajgyutpq-mq.htmlsql

MyBatis的一级缓存实现详解 及使用注意事项

https://blog.csdn.net/chenyao1994/article/details/79233725数据库

 

定义

关于缓存

缓存是介于物理数据源与应用程序之间,是对数据库中的数据复制一份临时放在内存中的容器,缓存

其做用是为了减小应用程序对物理数据源访问的次数,从而提升了应用程序的运行性能。session

Hibernate在进行读取数据的时候,根据缓存机制在相应的缓存中查询,若是在缓存中找到了须要的数据(咱们把这称作“缓存命 中"),mybatis

则就直接把命中的数据做为结果加以利用,避免了大量发送SQL语句到数据库查询的性能损耗。并发

缓存设计

通常咱们在项目整合中 存在数据访问的性能问题,研究了下缓存在各个阶段的应用,以在5个方面进行缓存的设计:性能

1.最底层能够配置的是MySQL自带的query cache,测试

2.mybatis的一级缓存,默认状况下都处于开启状态,只能使用自带的PerpetualCache,没法配置第三方缓存

3.mybatis的二级缓存,能够配置开关状态,默认使用自带的PerpetualCache,但功能比较弱,可以配置第三方缓存,

4.service层的缓存配置,结合spring,能够灵活进行选择

5.hibernate的一级缓存,默认也是开启状态,session级别的,能够自由使用。但这里注意下hibernate获取session的 方式。

6.hibernate的二级缓存须要引用 第三方的 插件,并在hibernate配置文件中进行相应的配置。

7.针对实际业务状况,直接缓存部分html页面,直接返回给客户端。

发如今整合的项目测试中被spring整合的mybatis和hibernate的一级缓存都失效了。

首先1.mybatis和hibernate的一级缓存生效的范围是sqlsession,是为了在sqlsession没有关闭时,业务须要重复查询相同数据使用的。一旦sqlsession关闭,则由这个sqlsession缓存的数据将会被清空。

spring一级缓存和二级缓存的区分

一级缓存
就是Session级别的缓存。一个Session作了一个查询操做,它会把这个操做的结果放在一级缓存中。
若是短期内这个session(必定要同一个session)又作了同一个操做,那么hibernate直接从一级缓存中拿,而不会再去连数据库,取数据。
它是内置的事务范围的缓存,不能被卸载。
二级缓存:
就是SessionFactory级别的缓存。顾名思义,就是查询的时候会把查询结果缓存到二级缓存中。
若是同一个sessionFactory建立的某个session执行了相同的操做,hibernate就会从二级缓存中拿结果,而不会再去链接数据库。
这是可选的插件式的缓存,在默认状况下,SessionFactory不会启用这个插件。
能够在每一个类或每一个集合的粒度上配置。缓存适配器用于把具体的缓存实现软件与Hibernate集成。
严格意义上说,SessionFactory缓存分为两类:内置缓存和外置缓存。咱们一般意义上说的二级缓存是指外置缓存。
内置缓存与session级别缓存实现方式类似。前者是SessionFactory对象的一些集合属性包含的数据,后者是指Session的一些集合属性包含的数据
SessionFactory的内置缓存中存放了映射元数据和预约义SQL语句。
映射元数据是映射文件中数据的拷贝;
而预约义SQL语句是在Hibernate初始化阶段根据映射元数据推导出来。
SessionFactory的内置缓存是只读的,应用程序不能修改缓存中的映射元数据和预约义SQL语句,所以SessionFactory不须要进行内置缓存与映射文件的同步。
Hibernate的这两级缓存都位于持久化层,存放的都是数据库数据的拷贝。
缓存的两个特性:
缓存的范围
缓存的并发访问策略
一、缓存的范围
决定了缓存的生命周期以及能够被谁访问。缓存的范围分为三类。
事务范围
进程范围
集群范围
注:
对大多数应用来讲,应该慎重地考虑是否须要使用集群范围的缓存,由于访问的速度不必定会比直接访问数据库数据的速度快多少。
事务范围的缓存是持久化层的第一级缓存,一般它是必需的;进程范围或集群范围的缓存是持久化层的第二级缓存,一般是可选的。
二、缓存的并发访问策略
当多个并发的事务同时访问持久化层的缓存的相同数据时,会引发并发问题,必须采用必要的事务隔离措施。
在进程范围或集群范围的缓存,即第二级缓存,会出现并发问题。
所以能够设定如下四种类型的并发访问策略,每一种策略对应一种事务隔离级别。
事务型并发访问策略是事务隔离级别最高,只读型的隔离级别最低。事务隔离级别越高,并发性能就越低。
A 事务型:仅仅在受管理环境中适用。它提供了Repeatable Read事务隔离级别。
对于常常被读但不多修改的数据,能够采用这种隔离类型,由于它能够防止脏读和不可重复读这类的并发问题。
B 读写型:提供了Read Committed事务隔离级别。仅仅在非集群的环境中适用。
对于常常被读但不多修改的数据,能够采用这种隔离类型,由于它能够防止脏读这类的并发问题。
C 非严格读写型:不保证缓存与数据库中数据的一致性。
若是存在两个事务同时访问缓存中相同数据的可能,必须为该数据配置一个很短的数据过时时间,从而尽可能避免脏读。
对于极少被修改,而且容许偶尔脏读的数据,能够采用这种并发访问策略。
D 只读型:对于历来不会修改的数据,如参考数据,可使用这种并发访问策略。
什么样的数据适合存放到第二级缓存中?
一、不多被修改的数据
二、不是很重要的数据,容许出现偶尔并发的数据
三、不会被并发访问的数据
四、参考数据
不适合存放到第二级缓存的数据?
一、常常被修改的数据
二、财务数据,绝对不容许出现并发
三、与其余应用共享的数据。
Hibernate的二级缓存策略的通常过程以下:
1) 条件查询的时候,老是发出一条select * from table_name where …. (选择全部字段)这样的SQL语句查询数据库,一次得到全部的数据对象。
2) 把得到的全部数据对象根据ID放入到第二级缓存中。
3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,若是配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。
4) 删除、更新、增长数据的时候,同时更新缓存。
注:
Hibernate的二级缓存策略,是针对于ID查询的缓存策略,对于条件查询则毫无做用。为此,Hibernate提供了针对条件查询的Query缓存。
Query缓存策略的过程以下:
1) Hibernate首先根据这些信息组成一个Query Key,Query Key包括条件查询的请求通常信息:SQL, SQL须要的参数,记录范围(起始位置rowStart,最大记录个数maxRows),等。
2) Hibernate根据这个Query Key到Query缓存中查找对应的结果列表。若是存在,那么返回这个结果列表;若是不存在,查询数据库,获取结果列表,把整个结果列表根据Query Key放入到Query缓存中。
3) Query Key中的SQL涉及到一些表名,若是这些表的任何数据发生修改、删除、增长等操做,这些相关的Query Key都要从缓存中清空。

 

图: (太忙, 后期补上吧)

相关文章
相关标签/搜索