二级缓存

MyBatis(缓存机制)

故事扮演 提交于 2019-12-05 19:32:57
缓存可以极大的提升查询效率。 MyBatis系统中默认定义两级缓存(一级缓存和二级缓存)。 一、两级缓存 1、一级缓存:(本地缓存):sqlSession级别的缓存。一级缓存是一直开启的;sqlSession级别的一个Map。   与数据库同一次会话期间查询到的数据会放在本地缓存中   以后如果需要获取相同的数据,直接从缓存中拿,没必要再去查询数据库;   一级缓存失效情况( 没有使用到当前一级缓存的情况,效果就是,还需要再向数据库发出查询 ):   1、sqlSession不同。   2、sqlSession相同,查询条件不同。(当前一级缓存中还没有这个数据)   3、sqlSession相同,两次查询之间执行了增删改操作( 这次增删改可能对当前数据有影响 )   4、sqlSession相同,手动清除了一级缓存(缓存清空) 2、二级缓存:(全局缓存):基于namespace级别的缓存:一个namespace对应一个二级缓存:   工作机制:   1、一个会话,查询一条数据,这个数据就会被放在当前会话的一级缓存中;   2、如果会话关闭;一级缓存中的数据会被保存到二级缓存中;新的会话查询信息,就可以参照二级缓存中的内容。   3、sqlSession===EmployeeMapper===>Employee           DepartmentMapper===

MYBATIS源码分析之02配置文件解析

拟墨画扇 提交于 2019-12-05 12:19:28
上一篇整合redis框架作为mybatis的二级缓存, 该篇从源码角度去分析mybatis是如何做到的。 通过上一篇文章知道,整合redis时需要在FemaleMapper.xml中添加如下配置 <cache eviction="LRU" type="qinfeng.zheng.RedisCache"/> MYBATIS源码分析之02配置文件解析 这篇文章讲解了mybatis解析配置文件具体的过程, 这里再总结一下,mybatis解析主配置文件使用了XMLConfigBuilder对象, 解析具体的Mapper接口配置则使用了XMLMapperBuilder对象,是不是很好记忆。。。 所以,要了解mybatis是如何是解析 <cache eviction="LRU" type="qinfeng.zheng.RedisCache"/> 这行代码 ,肯定得去XMLMapperBuilder这个类了, 具体看XMLMapperBuilder#configurationElement(XNode context)方法。 很明显,具体的实现在cacheElement()方法中, 结合debug看一下 接着我们可以再深究一下builderAssistant是如何创建这个缓存的。 public Cache useNewCache(Class<? extends Cache> typeClass,

mybatis集成redis作为二级缓存

点点圈 提交于 2019-12-05 09:57:28
mybatis默认开启了二级缓存功能,在mybatis主配置文件中,将cacheEnabled设置成false,则会关闭二级缓存功能 <settings> <!--二级缓存默认开启,false关闭--> <setting name="cacheEnabled" value="false" /> <!--mybatis日志打印到控制台--> <setting name="logImpl" value="STDOUT_LOGGING" /> </settings> mybatis框架虽然默认开启了二级缓存功能,但是并没有默认实现,也就是下面这句代码返回null, 然后走一级缓存 下面是配置Redis作为mybatis的二级缓存,代码如下: (1)mybatis主配置文件mybatis-config.xml中添加如下配置 <settings> <!--二级缓存默认开启,false关闭--> <setting name="cacheEnabled" value="true" /> <!--mybatis日志打印到控制台,以便于观察--> <setting name="logImpl" value="STDOUT_LOGGING" /> </settings> (2)FemaleMapper.xml 配置如下 <mapper namespace="qinfeng.zheng

mybatis一级二级缓存

五迷三道 提交于 2019-12-05 07:43:13
一级缓存分析 一级缓存是SqlSession范围的缓存,当调用SqlSession的修改,添加,删除,commit(),close()等方法时,就会清空一级缓存。 二级缓存 第一步 默认为true 可以不配置 第二步 实体对象xml配<cache/>开启二级缓存 第三步 配置userCache=“true” 来源: https://www.cnblogs.com/cwone/p/11914773.html

Java面试框架篇(8)

£可爱£侵袭症+ 提交于 2019-12-05 07:01:38
71,谈谈你对Struts的理解。 1. struts是一个按MVC模式设计的Web层框架,其实它就是一个Servlet,这个Servlet名为ActionServlet,或是ActionServlet的子类。我们可以在web.xml文件中将符合某种特征的所有请求交给这个Servlet处理,这个Servlet再参照一个配置文件将各个请求分别分配给不同的action去处理。 (struts的配置文件可以有多个,可以按模块配置各自的配置文件,这样可以防止配置文件的过度膨胀) 2.ActionServlet把请求交给action去处理之前,会将请求参数封装成一个formbean对象(就是一个java类,这个类中的每个属性对应一个请求参数), 3.要说明的是, ActionServlet把formbean对象传递给action的execute方法之前,可能会调用formbean的validate方法进行校验,只有校验通过后才将这个formbean对象传递给action的execute方法,否则,它将返回一个错误页面,这个错误页面由input属性指定。 4.action执行完后要返回显示的结果视图,这个结果视图是用一个ActionForward对象来表示的,actionForward对象通过struts-config.xml配置文件中的配置关联到某个jsp页面

MyBatis缓存详解

女生的网名这么多〃 提交于 2019-12-05 07:01:17
缓存体系结构 缓存一般是ORM框架都会提供的功能,目的就是提升查询效率和减少数据库的压力。跟Hibernate一样,MyBatis也有一级缓存和二级缓存,并且预留了集成第三方缓存的接口。 MyBatis跟缓存相关的类都在cache包里面,其中有一个Cache接口,只有一个默认的实现类PerpetualCache,它使用HashMap实现的。 除此之外,还有很多的装饰器,通过这些装饰器可以额外实现很多的功能:回收策略、日志记录、定时刷新等。 如果对装饰器不懂的,可以去看一下设计模式中的装饰者模式的资料。 但无论怎么装饰,最后使用的还是最基本的实现类PerpetualCache。 所有的缓存实现类总体上可以分为三类:基本缓存、淘汰算法缓存、装饰器缓存。 缓存实现类 描述 作用 装饰条件 基本缓存 缓存基本实现类 默认是PerpetualCache,也可以自定义比如RedisCache、EhCache等,具备基本功能的缓存类 无 LruCache LRU策略的缓存 当缓存达到上限时,删除最近最少使用的缓存(Least Recently Use) eviction="LRU"(默认) FifoCache FIFO策略的缓存 当缓存到达上限时,删除最先入队的缓存 eviction="FIFO" SoftCache WeakCache 带清理策略的缓存 通过JVM的软引用和弱引用来实现缓存

有关mybatis的笔试

六月ゝ 毕业季﹏ 提交于 2019-12-04 16:29:18
1.mybatis 中的 #{} 和 ${} 的区别? 答 : 定义: #{} 是预编译。 作用: mybatis 处理 #{} 时, sql 会将它替换成 ? ,然后调用 PreparedStatement 的 set 方法来赋值;还可以防止 sql 注入。 注释: sql 注入是一种注入攻击,可以执行恶意的 sql 语句。是通过 sql 代码插入数据库查询,使得攻击者可以控制 web 应用服务后面的数据库服务器 , 可以对数据库进行一些操作。比如添加,修改和删除数据库中的数据。 定义 :${} 字符串替换。 作用: mybatis 处理 ${} 时, sql 会将它替换成变量的值。 2.mybatis 有几种分页方式? 答 : 有四种,分别是数组分页, sql 分页,拦截器分页, Rowbounds 分页。 3.mybatis 的物理分页与逻辑分页的区别? 答 : 定义:物理分页是依赖于某个物理实体,这个实体就是数据库,例如 mysql 数据库提供的 limit 关键字,程序员编写关于 limit 关键字的查询语句,数据库就会返回分页结果。 定义 : 逻辑分页是程序员编写的代码,数据库返回的不是分页结果,而是全部数据,然后程序员通过代码获取分页数据。常用操作就是一次性查询全部数据存放到 list 集合,然后通过索引获取指定范围的数据, 两者对比: 数据库的负担

Mybaits 源码解析 (九)----- 全网最详细,没有之一:一级缓存和二级缓存源码分析

无人久伴 提交于 2019-12-04 01:20:37
像Mybatis、Hibernate这样的ORM框架,封装了JDBC的大部分操作,极大的简化了我们对 数据库 的操作。 在实际项目中,我们发现在一个事务中查询同样的语句两次的时候,第二次没有进行数据库查询,直接返回了结果,实际这种情况我们就可以称为缓存。 Mybatis的缓存级别 一级缓存 MyBatis的一级查询缓存(也叫作本地缓存)是基于org.apache.ibatis.cache.impl.PerpetualCache 类的 HashMap本地缓存,其作用域是SqlSession,myBatis 默认一级查询缓存是开启状态,且不能关闭。 在同一个SqlSession中两次执行相同的 sql查询语句,第一次执行完毕后,会将查询结果写入到缓存中,第二次会从缓存中直接获取数据,而不再到数据库中进行查询,这样就减少了数据库的访问,从而提高查询效率。 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,PerpetualCache 对象是在SqlSession中的Executor的localcache属性当中存放,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。 二级缓存 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为

一级缓存和二级缓存的区别

大憨熊 提交于 2019-12-04 01:09:20
区别: 一级缓存的作用域是一个sqlsession内; 二级缓存作用域是针对mapper进行缓存. 一级缓存: 1、第一次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,如果没有,从数据库查询用户信息。得到用户信息,将用户信息存储到一级缓存中。 2、如果中间sqlSession去执行commit操作(执行插入、更新、删除),则会清空SqlSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。 3、第二次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,缓存中有,直接从缓存中获取用户信息。 小结: 一级缓存时执行commit,close,增删改等操作,就会清空当前的一级缓存; 当对SqlSession执行更新操作(update、delete、insert)后并执行commit时,不仅清空其自身的一级缓存(执行更新操作的效果),也清空二级缓存(执行commit()的效果)。 二级缓存: 不管是不是相同的session,只要mapper的namespace相同,可能共享缓存,要求:如果开启了二级缓存,那么在关闭sqlsession后(close),才会把该sqlsession一级缓存中的数据添加到namespace的二级缓存中。 开启了二级缓存后,还需要将要缓存的pojo实现Serializable接口

Mybaits 源码解析 (九)----- 全网最详细,没有之一:一级缓存和二级缓存源码分析

北城以北 提交于 2019-12-04 00:16:27
像Mybatis、Hibernate这样的ORM框架,封装了JDBC的大部分操作,极大的简化了我们对数据库的操作。 在实际项目中,我们发现在一个事务中查询同样的语句两次的时候,第二次没有进行数据库查询,直接返回了结果,实际这种情况我们就可以称为缓存。 Mybatis的缓存级别 一级缓存 MyBatis的一级查询缓存(也叫作本地缓存)是基于org.apache.ibatis.cache.impl.PerpetualCache 类的 HashMap本地缓存,其作用域是SqlSession,myBatis 默认一级查询缓存是开启状态,且不能关闭。 在同一个SqlSession中两次执行相同的 sql查询语句,第一次执行完毕后,会将查询结果写入到缓存中,第二次会从缓存中直接获取数据,而不再到数据库中进行查询,这样就减少了数据库的访问,从而提高查询效率。 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,PerpetualCache 对象是在SqlSession中的Executor的localcache属性当中存放,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。 二级缓存 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为