二级缓存

(四)Mybatis 面试题

房东的猫 提交于 2020-03-10 13:52:51
Mybatis 86、Mybatis是什么? mybatis是一个持久层ORM框架。它内部封装了jdbc,使得开发更简洁,更高效。 Mybatis使开发者只需要关注sql语句本身,简化JDBC操作,不需要在关注加载驱动、创建连接、处理SQL语句等繁杂的过程。 MyBatis可以通过xml或注解完成ORM映射关系配置。 87、Mybatis和JDBC的关系? (标红) JDBC是Java提供的一个操作数据库的API; MyBatis是一个持久层ORM框架,底层是对JDBC的封装。 MyBatis对JDBC操作数据库做了一系列的优化: (1)mybatis使用已有的连接池管理,避免浪费资源,提高程序可靠性。 (2)mybatis提供插件自动生成DAO层代码,提高编码效率和准确性。 (3)mybatis 提供了一级和二级缓存,提高了程序性能。 (4)mybatis使用动态SQL语句,提高了SQL维护。(此优势是基于XML配置) (5)mybatis对数据库操作结果进行自动映射 88、什么是ORM?(标红) ORM的全称是Object Relational Mapping,即对象关系映射。 描述的是对象和表之间的映射。操作Java对象,通过映射关系,就可以自动操作数据库。 在ORM关系中,数据库表对应Java中的类,一条记录对应一个对象,一个属性对应一个列。 常见的ORM框架

Spring Cloud Gateway 扩展动态路由

人走茶凉 提交于 2020-03-06 02:13:04
Spring Cloud Gateway 扩展动态路由 路由配置 配置文件 spring : application : name : sc - gw cloud : nacos : discovery : server-addr : 127.0.0.1 : 8848 config : server-addr : 127.0.0.1 : 8848 file-extension : yml shared-dataids : application - $ { spring.profiles.active } .$ { spring.cloud.nacos.config.file - extension } gateway : discovery : locator : enabled : true lower-case-service-id : true routes : # Route Predicate Factories - id : nacos - getway - provider #自定义的路由ID,保持唯一 uri : lb : //nacos - provider #目标服务地址,以lib://开头(lb代表从注册中心获取服务) predicates : #路由条件,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将

Mybatis:一级缓存和二级缓存

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-06 01:46:46
缓存Cache 概述 存在于内存中的临时数据 作用 减少和数据库的交互次数,提高执行效率 适用场景 经常查询并且不经常改变的;数据的正确与否对最终结果影响不大的。(数据的有效性和实时性) 不适用 经常改变的数据;数据的正确与否对最终结果影响很大的 一级缓存 Mybatis 使用到了两种缓存:本地缓存(local cache)和二级缓存(second level cache),但是在没有配置的默认情况下,它只开启一级缓存。每当一个新 session 被创建,MyBatis 就会创建一个与之相关联的本地缓存。任何在 session 执行过的查询语句本身都会被保存在本地缓存中,那么,相同的查询语句和相同的参数所产生的更改就不会二度影响数据库了。本地缓存会被增删改、提交事务、关闭事务以及关闭 session 所清空。 一级缓存:指的是Mybatis中 SqlSession 对象的缓存 作用域:SqlSession范围,当在同一个sqlSession中执行两次相同的sql语句时,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次查询时会从缓存中获取数据,不再去底层数据库查询,从而提高查询效率。 不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。 如何会重新提交数据?: 关闭SqlSession对象close() ;如果SqlSession调用了close

MyBatis入门之二级缓存

心不动则不痛 提交于 2020-03-05 23:55:40
mybatis的二级缓存是namespace级别的,不同于一级缓存,二级缓存是SqlSession共享的,并且默认是不开启的,如果要开启,需要在mybatis的配置文件中的settings节点下,手动设置: <!-- 开启二级缓存,默认是false --> <setting name="cacheEnabled" value="true"></setting> 由于示例代码与之前的博客: MyBatis入门之一级缓存 基本相同,所以不贴重复的代码了,不同之处就是: (1)mybatis-config.xml开启二级缓存 <!-- 开启二级缓存,默认是false --> <setting name="cacheEnabled" value="true"></setting> (2)UserMapper.xml中设置二级缓存的各种属性 <!-- 设置二级缓存 --> <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/> 你也可以直接使用,表示都使用默认值 <cache/> 各个属性的意思(摘自 mybatis官网 ): 这个更高级的配置创建了一个 FIFO 缓存,每隔 60 秒刷新,最多可以存储结果对象或列表的 512 个引用,而且返回的对象被认为是只读的

MyBatis二级缓存

懵懂的女人 提交于 2020-03-02 10:13:55
一 MyBatis二级缓存原理 mybatis中的二级缓存是mapper级别的缓存,它是按照不同mapper有不同的namespace来区分的。也就是说,如果两个mapper的namespace相同,即使是两个mapper,那么这两个mapper中执行sql查询到的数据也将存在相同的二级缓存区域中。 二 MyBatis二级缓存使用 1开启二级缓存   由于mybaits的二级缓存是mapper范围级别,所以除了在SqlMapConfig.xml设置二级缓存的总开关外,还要在具体的mapper.xml中开启二级缓存。设置如下: [XML] 纯文本查看 复制代码 ? 1 2 3 < settings > < setting name = "cacheEnabled" value = "true" /> </ settings > 这是在SqlMapConfig.xml中设置的,还得在具体的mapper.xml中设置,如下: [XML] 纯文本查看 复制代码 ? 1 2 3 4 < mapper namespace = "com.itheima.dao.IUserDao" > <!--开启user支持二级缓存--> < cache /> </ mapper > 2 将需要缓存的类实现Serializable接口 [Java] 纯文本查看 复制代码 ? 1 2 3 4 5 6 7 8

mybatis 一级缓存 二级缓存

筅森魡賤 提交于 2020-03-01 12:29:27
1.一级缓存 一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象,在对象中有一个(内存区域)数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。 Mybatis默认开启一级缓存。 一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。当一个sqlSession结束后该sqlSession中的一级缓存也就不存在了。 @Test public void testCache1() throws Exception{ SqlSessionsqlSession = sqlSessionFactory.openSession();//创建代理对象 UserMapperuserMapper = sqlSession.getMapper(UserMapper.class); //下边查询使用一个SqlSession //第一次发起请求,查询id为1的用户 Useruser1 = userMapper.findUserById(1); System.out.println(user1); //

Mybatis----缓存

£可爱£侵袭症+ 提交于 2020-03-01 05:58:02
Mybatis 缓存 像大多数的持久化框架一样, Mybatis 也提供了缓存策略,通过缓存策略来 减少数据库的查询次数, 从而提高性能。 Mybatis 中缓存分为 一级缓存,二级缓存 。 什么是缓存: 存在于内存中的临时数据。 什么样的数据能使用缓存,什么样的数据不能使用 适用于缓存: 经常查询并且不经常改变的。 数据的正确与否对最终结果影响不大的。 不适用于缓存: 经常改变的数据 数据的正确与否对最终结果影响很大的。 例如:商品的库存,银行的汇率,股市的牌价。 Mybatis 一级缓存 它指的是Mybatis中SqlSession对象的缓存。 当我们执行查询之后,查询的结果会同时 存入到SqlSession 为我们提供一块区域中。 该区域的结构是一个Map。当我们再次查询同样的数据,mybatis会先去sqlsession中 查询是否有,有的话直接拿出来用。 当SqlSession对象消失时,mybatis的一级缓存也就消失了。 一级缓存的分析 一级缓存是 SqlSession 范围的缓存,当调用 SqlSession 的修改,添加,删除, commit(), close()等方法时,就会清空一级缓存。 第一次发起查询用户 id 为 1 的用户信息,先去找缓存中是否有 id 为 1 的用户信息,如果没有,从数据库查询用户信息。 得到用户信息,将用户信息存储到一级缓存中。 如果

MyBatis常见面试问题

我是研究僧i 提交于 2020-02-28 22:31:15
一、 JDBC编程有哪些不足之处,Mybatis是如何解决这些问题的? 1) 数据库连接的创建、释放频繁造成系统资源浪费从而影响了性能,如果使用数据库连接池就可以解决这个问题。当然JDBC同样能够使用数据源。 解决:在xml中配置数据连接池,使用数据库连接池管理数据库连接。 2) SQL语句在写代码中不容易维护,事件需求中SQL变化的可能性很大,SQL变动需要改变JAVA代码。 解决:将SQL语句配置在mapper.xml文件中与java代码分离。 3) 向SQL语句传递参数麻烦,因为SQL语句的where条件不一定,可能多,也可能少,占位符需要和参数一一对应。 解决:Mybatis自动将java对象映射到sql语句。 4) 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。 解决:Mbatis自动将SQL执行结果映射到java对象。 二、 Mybatis编程步骤 ? Step1:创建SQLSessionFactory Step2:通过SQLSessionFactory创建SQLSession Step3:通过SQLSession执行数据库操作 Step4:调用session.commit()提交事物 Step5:调用session.close()关闭会话 三、 MyBatis与hibernate有哪些不同 ? 1

mybatis一级缓存二级缓存

江枫思渺然 提交于 2020-02-27 00:21:52
一级缓存   Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言。所以在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SelSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库。                  为什么要使用一级缓存,不用多说也知道个大概。但是还有几个问题我们要注意一下。    1、一级缓存的生命周期有多长?    a、MyBatis在开启一个数据库会话时,会创建一个新的SqlSession对象,SqlSession对象中会有一个新的Executor对象。Executor对象中持有一个新的PerpetualCache对象;当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。   b、如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用。   c、如果SqlSession调用了clearCache()

MyBatis缓存配置

眉间皱痕 提交于 2020-02-26 10:19:19
一级缓存   Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言。所以在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SelSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库。                  为什么要使用一级缓存,不用多说也知道个大概。但是还有几个问题我们要注意一下。    1、一级缓存的生命周期有多长?    a、MyBatis在开启一个数据库会话时,会 创建一个新的SqlSession对象,SqlSession对象中会有一个新的Executor对象。Executor对象中持有一个新的PerpetualCache对象;当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。   b、如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用。   c、如果SqlSession调用了clearCache()