二级缓存

Hibernate小结

雨燕双飞 提交于 2020-01-18 00:58:42
1.Hibernate缓存 Hibernate一级缓存又称为“Session的缓存”,它是内置的,意思就是说,只要你使用hibernate就必须使用session缓存。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。在第一级缓存中,持久化类的每个实例都具有唯一的OID。 Hibernate二级缓存又称为“SessionFactory的缓存”,由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。第二级缓存是可选的,是一个可配置的插件,在默认情况下,SessionFactory不会启用这个插件。 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;如果都查不到,再查询数据库,把结果按照ID放入到缓存。 删除、更新、增加数据的时候,同时更新缓存。 同理和mybatus一样,分布式情况下,这缓存也失效了。 2.hibernate核心接口 session:负责被持久化对象CRUD操作 sessionFactory:负责初始化hibernate,创建session对象 configuration

mybatis的缓存和注解开发(4)

人走茶凉 提交于 2020-01-16 20:42:01
第四天:mybatis的缓存和注解开发 mybatis中的加载时机(查询的时机) mybatis中的一级缓存和二级缓存 mybatis的注解开发 单表CRUD 多表查询 一、今日内容概要 1、Mybatis中的延迟加载 问题:在一对多中,当我们有一个用户,它有100个账户。 在查询用户的时候,要不要把关联的账户查出来? 在查询账户的时候,要不要把关联的用户查出来? 在查询用户时,用户下的账户信息应该是,什么时候使用,什么时候查询的。 在查询账户时,账户的所属用户信息应该是随着账户查询时一起查询出来。 什么是延迟加载 在真正使用数据时才发起查询,不用的时候不查询。按需加载(懒加载) 什么是立即加载 不管用不用,只要一调用方法,马上发起查询。 在对应的四种表关系中:一对多,多对一,一对一,多对多 一对多,多对多:通常情况下我们都是采用延迟加载。 多对一,一对一:通常情况下我们都是采用立即加载。 2、Mybatis中的缓存 什么是缓存 存在于内存中的临时数据。 为什么使用缓存 减少和数据库的交互次数,提高执行效率。 什么样的数据能使用缓存,什么样的数据不能使用 适用于缓存: 经常查询并且不经常改变的。 数据的正确与否对最终结果影响不大的。 不适用于缓存: 经常改变的数据 数据的正确与否对最终结果影响很大的。 例如:商品的库存,银行的汇率,股市的牌价。 Mybatis中的一级缓存和二级缓存

mybatis缓存

…衆ロ難τιáo~ 提交于 2020-01-15 07:53:16
一级缓存: 一级缓存在mybatis是 默认开启 的; 一级缓存的作用范围只在 会话级别 ,即会话死亡,缓存也会跟着清空 缓存清空的时机: 执行添加,修改,删除,提交,关闭会话等操作会情况SQLSession张红的一级缓存数据; 注 :当没有配置连接池的时候,同一个会话里面查询两次才会使用一级缓存,这样就显得比较鸡肋 但是当我们配置了线程池以后,连接池中有一定数量的常驻会话,这些会话是会循环使用不会关闭的 所以会有第一的几率命中一级缓存,在并发高的情况下,也能减轻很多负担 二级缓存: 二级缓存是 默认关闭 的 二级换在整个会话级别都是有效的(也就是所有的session/namespace共享的),只要会话工厂不死,二级缓存就在; 二级缓存的使用: 二级缓存在使用前要开启,需要在核心配置文件的settings标签下开启; < settings > <!--开启懒加载--> < setting name = " lazyLoadingEnabled " value = " true " /> <!--开启缓存--> < setting name = " cacheEnabled " value = " true " /> < setting name = " logImpl " value = " STDOUT_LOGGING " /> </ settings >

MyBatis 查询结果的缓存

我的未来我决定 提交于 2020-01-12 19:26:41
MyBatis的缓存指的是缓存查询结果,当以后使用相同的sql语句、传入相同的参数进行查询时,可直接从mybatis本地缓存中获取查询结果,而不必查询数据库。 mybatis的缓存包括一级缓存、二级缓存,一级缓存默认是开启的,二级缓存默认是关闭的。 一级缓存: SqlSession级别,在SqlSession中有一个Map,key是由sql语句、参数等信息组成的唯一值,value是查询出来的结果对象。 二级缓存: mapper级别,同一个namespace下的mapper,有一个Map。 二级缓存可以使这些sqlSession做到查询结果共享。 一级缓存 一级缓存默认是开启的。 User user1 = mapper.queryUserById(1); User user2 = mapper.queryUserById(1); 第一次查询时,就将查询结果放到一级缓存中。 如果后续使用的sql语句相同、传入的实参也相同,则结果对象也会相同,直接从一级缓存中获取结果对象,不再查询数据库。 User user1 = mapper.queryUserById(1); sqlSession.commit(); User user2 = mapper.queryUserById(1); 如果此sqlSession调用了commit()方法,会自动清空此sqlSession的一级缓存。

一级缓存和二级缓存验证

一笑奈何 提交于 2020-01-11 06:42:07
先上干货: 1.MyBatis缓存 a ) 一级缓存 : SqlSession a ) 默认开启的 b ) 一级缓存只对当前SqlSession有效 b ) 二级缓存 : SqlSessionFactory b ) 默认是关闭的,需要手动开启 b ) 如何开启二级缓存呢? a ) 在Mapper文件中添加<cache>标签 b ) 放在缓存中的对象需要实现序列化接口 1 ) 对象序列化 ( 保证对象读写一致的 ) 2 ) 版本号 c ) 事务需要提交 c ) 每个SQLSession共享 2.缓存的概念 1 ) 缓存是提高查询效率,减少和数据库的交互 2 ) 最大的问题就是同一个数据放了两个地方 a ) 修改数据库,刷新缓存 3.适合放入缓存中的数据 1 ) 经常被查询 2 ) 很少被修改 4.不适合放入缓存中的数据 1 ) 经常被修改 2 ) 很少被查询 3 ) 重要的数据 ( 公共的资源,票,钱 ) 首先测试一级缓存:运行测试代码 同一个sqlsession中多次查询 运行结果: 通过结果可知: 同一个sqlsession只要未关闭可以进行多次操作(增删改查等 即:调增删改查相关方法方法) 第一次查询时会提交sql语句,之后相同的操作都不会再提交sql,因为有一级缓存(sqlsession范围的缓存),相同 的操作后续会从缓存中获取结果 但是,一旦sqlsession关闭(即

mybatis使用redis做二级缓存

两盒软妹~` 提交于 2020-01-09 12:30:25
redis安装 springboot+mybatis搭建 maven < dependency > < groupId > org.mybatis.spring.boot </ groupId > < artifactId > mybatis-spring-boot-starter </ artifactId > < version > 2.1.1 </ version > </ dependency > < dependency > < groupId > org.springframework.boot </ groupId > < artifactId > spring-boot-starter-web </ artifactId > </ dependency > < dependency > < groupId > mysql </ groupId > < artifactId > mysql-connector-java </ artifactId > < scope > runtime </ scope > </ dependency > application.yml spring : #DataSource datasource : driver-class-name : com.mysql.cj.jdbc.Driver url : jdbc : mysql :

Hibernate的缓存?

跟風遠走 提交于 2020-01-06 22:54:56
一、why(为什么要用 Hibernate缓存?) Hibernate是一个持久层框架,经常访问物理数据库。为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。为了提供访问速度,把磁盘或数据库访问变成内存访问。 二、what(Hibernate缓存原理是怎样的?)Hibernate缓存包括两大类:Hibernate一级缓存和 Hibernate二级缓存。 1.Hibernate一级缓存又称为“Session的缓存”。Session缓存内置不能被卸载,Session的缓存是事务范围的缓存(Session对象的生命周期通常对应一个数据库事务或者一个应用事务)。一级缓存中,持久化类的每个实例都具有唯一的 OID。 2.Hibernate二级缓存又称为“SessionFactory的缓存”。由于 SessionFactory 对象的生命周期和应用程序的整个过程对应,因此 Hibernate 二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。第二级缓存是可选的,是一个可配置的插件,默认下 SessionFactory不会启用这个插件。Hibernate提供了 org

Mybatis面试题

人走茶凉 提交于 2020-01-04 03:08:32
1、Mybatis动态sql是做什么的?都有哪些动态sql?简述一下动态sql的执行原理? 答:动态Sql主要是根据对象中的不通的取值,来实现对Sql的一个动态的拼接,实现不同的Sql的语句。 主要动态Sql 的标签有 If语句(简单的条件判断) Choose(when/otherwise),相当于java语言中的switch,与jstl中choose类似 Trim(对包含的内容加上prefix,或者suffix) Where(主要是用来简化SQL语句中where条件判断,能智能的处理and/or 不用担心多余的语法导致的错误) Set(主要用于更新时候) Foreach(一般使用在mybatis in语句查询时特别有用) 以及 sql 标签来抽取sql 的片段,简化代码 执行原理: 2、Mybatis是否支持延迟加载?如果支持,它的实现原理是什么? 答:Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled =true|false。 它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName()

网站架构之缓存应用(摘录)

寵の児 提交于 2019-12-30 05:25:50
网站缓存这个话题并不新颖,但是能否将它用好,可是一门学问,同一件工具在不同人的手中会做出不同的事情来。这里我来分享总结下我对于网站架构中缓存应用的一些看法和经验,大家有好的想法可以补充 第一:缓存的一些基本概念。 1:缓存(CACHE)与缓冲(BUFFER)的区别,我认为缓存可以在某种程序上理解成一级缓存(Primary Cache),数据全局共享。缓冲则属于二级缓存,只对一部分对象共享数据,二级缓存在某种程序上主要是降低一级缓存组件的访问压力以及提高缓存的存取效率。 2:缓存的一些基本属性:命中率,表示缓存命中的次数/总的请求数,这是缓存设计的重要质量指标之一;缓存执行效率,例如GET,INSERT,DELETE等;容量,即缓存介质的容量最大值;成本,即开发成本,部署成本,软硬件成本。 3:缓存的问题,存储介质的选择往往左右缓存的设计,缓存在不命中时往往会使性能下降。 第二:网站中缓存的应用场景: 1:可以缓存整个页面的html,提高访问响应能力; 2:针对局部页面元素进行缓存; 3:对复杂数据的结果进行缓存,例如一个查询需要结合多个数据集,然后根据这些数据集进行相应的运算,即使每个子集查询有缓存,但还是需要额外的运算,这种情况可以考虑缓存计算后的结果。 4:对耗时的查询进行缓存,例如产品列表页的查询。 5:和上下文相关的用户数据,例如用户从订单埴写页进入到订单成功页

Mybatis 为什么不要用二级缓存

随声附和 提交于 2019-12-26 03:42:46
https://www.cnblogs.com/liouwei4083/p/6025929.html mybatis 二级缓存不推荐使用 一 mybatis的缓存使用。 大体就是首先根据你的sqlid,参数的信息自己算出一个key值,然后你查询的时候,会先把这个key值去缓存中找看有没有value,如果有,直接返回出来,就不查询db了。如果没有,那么查询db,然后将key,value保存到缓存中,以便下次使用。 1.1mybatis的一级缓存是基于sqlsession为生命周期的 当你这个session没有了,缓存就没有了,其次当你sql执行!isselect语句的时候,缓存也会被直接全部清理掉以保证数据一致性。 public int update(MappedStatement ms, Object parameter) throws SQLException { ErrorContext.instance().resource(ms.getResource()).activity("executing an update").object(ms.getId()); if (closed) throw new ExecutorException("Executor was closed."); //清理缓存 clearLocalCache(); return doUpdate