二级缓存

JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结

牧云@^-^@ 提交于 2019-12-16 15:54:33
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 我是一名java开发人员,hibernate以及mybatis都有过学习,在 java面试 中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和学习,使自己在做项目中更加得心应手。 第一方面:开发速度的对比 就开发速度而言,Hibernate的真正掌握要比Mybatis来得难些。Mybatis框架相对简单很容易上手,但也相对简陋些。个人觉得要用好Mybatis还是首先要先理解好Hibernate。 比起两者的开发速度,不仅仅要考虑到两者的特性及性能,更要根据项目需求去考虑究竟哪一个更适合项目开发,比如:一个项目中用到的复杂查询基本没有,就是简单的增删改查,这样选择hibernate效率就很快了,因为基本的sql语句已经被封装好了,根本不需要你去写sql语句,这就节省了大量的时间,但是对于一个大型项目,复杂语句较多,这样再去选择hibernate就不是一个太好的选择,选择 mybatis 就会加快许多,而且语句的管理也比较方便。 第二方面:开发工作量的对比 Hibernate和MyBatis都有相应的代码生成工具。可以生成简单基本的DAO层方法。针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap

Mybatis的一级缓存和二级缓存

浪尽此生 提交于 2019-12-16 13:13:21
先说缓存,合理使用缓存是优化中最常见的,将从数据库中查询出来的数据放入缓存中,下次使用时不必从数据库查询,而是直接从缓存中读取,避免频繁操作数据库,减轻数据库的压力,同时提高系统性能。 一级缓存 一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构用于存储缓存数据。不同的sqlSession之间的缓存数据区域是互相不影响的。也就是他只能作用在同一个sqlSession中,不同的sqlSession中的缓存是互相不能读取的。 一级缓存的工作原理: 用户发起查询请求,查找某条数据,sqlSession先去缓存中查找,是否有该数据,如果有,读取; 如果没有,从数据库中查询,并将查询到的数据放入一级缓存区域,供下次查找使用。 但sqlSession执行commit,即增删改操作时会清空缓存。这么做的目的是避免脏读。 如果commit不清空缓存,会有以下场景:A查询了某商品库存为10件,并将10件库存的数据存入缓存中,之后被客户买走了10件,数据被delete了,但是下次查询这件商品时,并不从数据库中查询,而是从缓存中查询,就会出现错误。 既然有了一级缓存,那么为什么要提供二级缓存呢? 二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存

Spring Cloud进阶篇之Eureka原理分析

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-15 14:25:54
前言 时光小说 https://www.youxs.org/ 之前写了几篇Spring Cloud的小白教程,相信看过的朋友对Spring Cloud中的一些应用有了简单的了解,写小白篇的目的就是为初学者建立一个基本概念,让初学者在学习的道路上建立一定的基础。 从今天开始,我会持续更新几篇Spring Cloud的进阶教程。 Eureka简介 Eureka是Netflix开发的服务发现框架,本身就是一个基于REST的服务。Spring Cloud将它集成在其子项目spring-cloud-netflix中,用来实现服务的注册与发现功能。 Eureka总体架构图 Eureka组件介绍 服务注册中心集群 分别部署在IDC1、IDC2、IDC3中心 服务提供者 服务提供者一个部署在IDC1,一个部署在IDC3 服务消费者 服务消费者一个部署在IDC1,一个部署在IDC2 组件之间的调用关系 服务提供者 启动服务 :服务提供者会向服务注册中心发起Register请求,注册服务。 运行过程中 :服务提供者会定时向注册中心发送Renew心跳,告诉它“我还活着”。 停止服务提供 :服务提供者会向服务注册中心发送Cancel请求,告诉它清空当前服务注册信息。 服务消费者 启动后 :从服务注册中心拉取服务注册信息。 运行过程中 :定时更新服务注册信息。 发起远程调用 : -

Hibernate的一级缓存和二级缓存

妖精的绣舞 提交于 2019-12-14 06:46:09
文章目录 1. Hibernate的一级缓存 2. 证明一级缓存的存在 3. 一级缓存的内部结构 4. Hibernate的二级缓存 1. Hibernate的一级缓存 缓存是计算机领域非常通用的概念。它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是 降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能 。缓存中的数据是数据存储源中数据的拷贝,缓存的物理介质通常是内存。 Hibernate的缓存分为一级缓存和二级缓存,Hibernate的这两级缓存都位于持久化层,存储的都是数据库数据的备份。其中第一级缓存为Hibernate的内置缓存,不能被卸载。接下来围绕Hibernate的一级缓存进行详细的讲解。 Hibernate的一级缓存就是指Session缓存,Session缓存是一块内存空间,用来存放管理的Java对象。在使用Hibernate査询对象的时候,首先会使用对象属性的OID值在Hibernate的一级缓存中进行査找,如果找到匹配OID值的对象,就直接将该对象从一级缓存中取出使用,不会再查询数据库。如果没有找到相同OID值的对象,则会去数据库中査找相应数据。当从数据库中査询到所需数据时,该数据信息也会放置到一级缓存中。 Hibernate的一级缓存的作用就是减少对数据库的访问次数 。 在Session接口的实现中包含一系列的Java集合

Hibernate的一级缓存和二级缓存

社会主义新天地 提交于 2019-12-12 00:52:59
文章目录 1. Hibernate的一级缓存 2. 证明一级缓存的存在 3. 一级缓存的内部结构 4. Hibernate的二级缓存 1. Hibernate的一级缓存 缓存是计算机领域非常通用的概念。它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是 降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能 。缓存中的数据是数据存储源中数据的拷贝,缓存的物理介质通常是内存。 Hibernate的缓存分为一级缓存和二级缓存,Hibernate的这两级缓存都位于持久化层,存储的都是数据库数据的备份。其中第一级缓存为Hibernate的内置缓存,不能被卸载。接下来围绕Hibernate的一级缓存进行详细的讲解。 Hibernate的一级缓存就是指Session缓存,Session缓存是一块内存空间,用来存放管理的Java对象。在使用Hibernate査询对象的时候,首先会使用对象属性的OID值在Hibernate的一级缓存中进行査找,如果找到匹配OID值的对象,就直接将该对象从一级缓存中取出使用,不会再查询数据库。如果没有找到相同OID值的对象,则会去数据库中査找相应数据。当从数据库中査询到所需数据时,该数据信息也会放置到一级缓存中。 Hibernate的一级缓存的作用就是减少对数据库的访问次数 。 在Session接口的实现中包含一系列的Java集合

MyBatis-13-缓存

非 Y 不嫁゛ 提交于 2019-12-09 18:32:20
13、缓存(了解) 13.1、简介 查询 : 连接数据库,耗资源! 一次查询的结果,给他暂存在一个可以直接取到的地方!--->内存 : 缓存 我们再次查询相同数据的时候,直接走缓存,就不用走数据库了 什么是缓存[Cache]? 存在内存中的临时数据。 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询, 从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。 为什么使用缓存? 减少和数据库的交互次数,减少系统开销,提高系统效率。 什么样的数据能使用缓存? 经常查询并且不经常改变的数据。 13.2、Mybatis缓存 MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。 MyBatis系统中默认定义了两级缓存: 一级缓存 和 二级缓存 默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地缓存) 二级缓存需要手动开启和配置,他是基于namespace级别的缓存。 为了提扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存 13.3、 一级缓存也叫本地缓存:SqlSession 与数据库同义词会话期间查询到的数据会放在本地缓存中。 以后如果需要获取相同的数据,直接从缓存中拿,没有必要再去查询数据; 测试步骤: 开启日志!

mybatis一级缓存与二级缓存

亡梦爱人 提交于 2019-12-07 23:20:31
一级缓存 :默认开启 MyBatis一级缓存的生命周期和SqlSession一致。 MyBatis一级缓存内部设计简单,只是一个没有容量限定的HashMap,在缓存的功能性上有所欠缺。 MyBatis的一级缓存最大范围是SqlSession内部,有多个SqlSession或者分布式的环境下,数据库写操作会引起脏数据, 脏数据原因:在一个sqlSession中执行几个查询操作,但在这些查询操作中间另一个sqlSession去更新了数据库,而这次的更新第一个sqlSession是无感知的,此时它再去查询依然是在缓存中查询 使用mybatis-spring时一级缓存失效(原因没弄懂) 二级缓存: 默认关闭       生命周期为namespace   开启二级缓存的步骤:一开启全局缓存(setting中 默认开启)             二在对应的mapper.xml中开启   当sqlSession没有关闭时或者提交时,这次查询的数据不会缓存到二级缓存 MyBatis的二级缓存相对于一级缓存来说,实现了 SqlSession 之间缓存数据的共享,同时粒度更加的细,能够到 namespace 级别,通过Cache接口实现类不同的组合,对Cache的可控性也更强。 MyBatis在多表查询时,极大可能会出现脏数据(一个namespace中的缓存变化对另一个namespace是无感知的)

mybatis学习日记3

雨燕双飞 提交于 2019-12-07 12:10:27
1.mybatis的延迟加载 问题:在一对多中,当我们有一个用户,他有100个账户 在查询用户的时候,要不要把关联的账户查出来? 在查询账户的时候,要不要把关联的用户查出来? 解决:在查询用户的时候,用户下的账户信息应该是,什么时候使用,什么时候查询出来,如果每次查询用户的时候都把关联的账户信息查询出来,会浪费内存空间 但是在查询账户时,账所属的用户信息应该是随着账户查询时一起查询出来 1.1.什么是延迟加载: 延迟加载:在真正使用数据时才发起查询,不用的时候不查询,所以是按需加载(懒加载)。 1.2.延迟加载的优缺点 延迟加载的好处:先从单表查询,需要时再从关联表去关联查询,大大提高数 据库性能,因为查询单表要比关联查询多张表速度要快。 延迟加载的坏处:因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗 时间,所以可能造成用户等待时间变长,造成用户体验下降。 2.多对一、一对一延迟加载的实现 使用assocation实现延迟加载 需求:查询账户信息同时查询用户信息 2.1 账户的持久层 DAO 接口 public interface IAccountDao { /** *查询所有账户,同时获取账户的所属用户名称以及它的地址信息 * @return */ List<Account> findAll(); } 2.2. 账户的持久层映射文件 <

MyBatis(三)缓存

我只是一个虾纸丫 提交于 2019-12-06 05:15:39
1. 应用程序和数据库交互的过程是一个相对比较耗时的过程 2. 缓存存在的意义:让应用程序减少对数据库的访问,提升程序运行 效率 3. MyBatis 中默认 SqlSession 缓存开启 3.1 同一个 SqlSession 对象调用同一个<select>时,只有第一次访问数据库,第一次之后把查询结果缓存到 SqlSession 缓存区(内存)中 3.2 缓存的是 statement 对象.(简单记忆必须是用一个<select>) 3.2.1 在 myabtis 时一个<select>对应一个 statement 对象 3.3 有效范围必须是同一个 SqlSession 对象 4. 缓存流程 4.1 步骤一: 先去缓存区中找是否存在 statement 4.2 步骤二:返回结果 4.3 步骤三:如果没有缓存 statement 对象,去数据库获取数据 4.4 步骤四:数据库返回查询结果 4.5 步骤五:把查询结果放到对应的缓存区中 5. SqlSessionFactory 缓存 5.1 又叫:二级缓存 5.2 有效范围:同一个 factory 内哪个 SqlSession 都可以获取 5.3 什么时候使用二级缓存: 5.3.1 当数据频繁被使用,很少被修改 5.4 使用二级缓存步骤 5.4.1 在 mapper.xml 中添加 5.4.2 如果不写 readOnly=”true

java - mybatis - 缓存

前提是你 提交于 2019-12-05 19:43:54
mybatis有2级缓存 一级缓存(本地缓存, sqlsession级别) 二级缓存(全局缓存) 缓存时会把查询结果暂时存入内存,下次调用时直接返回结果,不再访问数据库。 . 一级缓存失效的情况: 1. 两次数据库会话 (不同的数据库回话会有各自独立的缓存空间) 2. 同一个sql,不同的参数(等于之前没有查到过,自然也就不会用到缓存)。 3. 有增删改的操作(更改过数据后会清空缓存,不管改的是哪个表的哪条数据) (读写分离的原因) 4. 手动清空缓存 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession openSession = sqlSessionFactory.openSession(); openSession.clearCache(); 一级缓存的实现原理: 有一个Cache接口,里面有一个map用来存放缓存数据。 底层继承Cache后用cache.put(key, value) 存入缓存。 key = 方法hashcode码,版本号,方法路径,会话编号,sql语句, 运行环境等拼成的一个字符串。 会话,sql,参数,版本号(数据更新时改变)等,有一个修改了,key都会变,进而导致缓存失效。 value = 查询结果。