二级缓存

mybatis中一级缓存和二级缓存

匿名 (未验证) 提交于 2019-12-02 23:32:01
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 (

SpringBoot:redis分布式缓存

谁说胖子不能爱 提交于 2019-12-02 22:41:46
前言 应用系统需要通过Cache来缓存不经常改变得数据来提高系统性能和增加系统吞吐量,避免直接访问数据库等低速存储系统。缓存的数据通常存放在访问速度更快的内存里或者是低延迟存取的存储器,服务器上。应用系统缓存,通常有如下作用: 缓存web系统的输出,如伪静态页面。 缓存系统的不经常改变的业务数据,如用户权限,字典数据.配置信息等 大家都知道springBoot项目都是微服务部署,A服务和B服务分开部署,那么它们如何更新或者获取共有模块的缓存数据,或者给A服务做分布式集群负载,如何确保A服务的所有集群都能同步公共模块的缓存数据,这些都涉及到分布式系统缓存的实现。(ehcache可以通过Terracotta组件一个缓存集群,这个暂时不讲) 但是ehcache的设计并不适合做分布式缓存,所以今天用redis来实现分布式缓存。 架构图: 一二级缓存服务器 使用Redis缓存, 通过网络访问还是不如从内存中获取性能好,所以通常称之为二级缓存 , 从内存中取得的缓存数据称之为一级缓存。 当应用系统需要查询缓存的时候,先从一级缓存里查找,如果有,则返回,如果没有查找到,则再查询二级缓存,架构图如下 Spring Boot 2 自带了前面俩种缓存的实现方式,本文将简单实现第三种,高速一二级缓存实现 Redis分布式缓存 1.pom文件 <dependency>   <groupId>org

java基础之框架hibernate

假如想象 提交于 2019-12-02 20:37:24
1.什么是缓存?  缓存是介于物理数据源与应用程序之间,是对数据库中的数据复制一份临时放在内存中的容器,其作用是为了减少应用程序对物理数据源访问的次数,从而提高了应用程序的运行性能。Hibernate在进行读取数据的时候,根据缓存机制在相应的缓存中查询,如果在缓存中找到了需要的数据(我们把这称做“缓存命 中"),则就直接把命中的数据作为结果加以利用,避免了大量发送SQL语句到数据库查询的性能损耗。 hibernate缓存: (1)一级缓存( 又称作事务缓存,是hibernate内置的,不能卸除 )就是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个 session(一定要同一个session)又做了同一个操作,那么hibernate直接从一级缓存中拿,而不会再去连数据库,取数据; 缓存的生命周期依赖于Session的生命周期,当Session被关闭后,缓存也就结束生命周期 。 (2)二级缓存就是SessionFactory级别的缓存,顾名思义,就是查询的时候会把查询结果缓存到二级缓存中,如果 同一个sessionFactory创建的 某个session执行了相同的操作,hibernate就会从二级缓存中拿结果,而不会再去连接数据库; (3)Hibernate中提供了两级Cache

使用Redis在Hibernate中进行缓存

点点圈 提交于 2019-12-02 18:55:06
Hibernate 是Java编程语言的开放源代码,对象/关系映射框架。Hibernate的目标是帮助开发人员摆脱许多繁琐的手动数据处理任务。Hibernate能够在Java类和数据库表之间以及Java和SQL中的数据类型之间创建映射。 任何处理大量数据的非平凡应用程序都必须依靠缓存和其他技术来提高效率。缓存是一种通过使用缓冲区存储经常访问的数据来提高应用程序性能的策略。通过减少数据库请求的数量并将数据存储在更靠近CPU的位置,缓存可以显着提高应用程序的速度。 在本文中,我们将研究如何使用 Redisson (一种用于访问内存中数据结构存储Redis的Java包装器)在Hibernate中执行缓存。 Hibernate 第一级 二级缓存 Hibernate使用多级缓存方案。第一级是强制性的,默认情况下处于启用状态,而第二级是可选的。 一级缓存 一级缓存(也称为L1缓存)与Hibernate的 Session对象 相关联,该对象表示Java应用程序和SQL数据库之间的连接。这意味着仅在会话存在的前提下,一级缓存才可用。每个第一级缓存只能由与其关联的Session对象访问。 首次从数据库中查询实体时,该实体将存储在与该会话关联的第一级缓存中。在同一会话期间对此实体的任何后续查询都将从缓存而不是数据库中检索实体。 二级缓存 二级缓存(也称为L2缓存)默认情况下处于禁用状态

Mybatis 一级缓存、二级缓存

不想你离开。 提交于 2019-12-02 13:24:19
查询缓存 首先,我们先看一下这个标题“查询缓存”,那就说明跟 增、删、改是没有任何关联的 , 只有在查询时,才会遇到缓存,增删改不涉及! 查询缓存目前Mybatis中提供了两个,分别是:一级缓存、二级缓存; 一级缓存 先说一下一级缓存的范围:同一个SqlSession对象,也就说,我们是同一个SqlSession对象,又要进行同样的查询操作,那么,我们就可以去缓存中获取; 所以,SqlSession的缓存,是属于一级缓存; 那,又有什么用呢? 比如,我们现在数据库中有两条数据,分别是张三跟李四; 我现在呢,要根据name来查询张三这个人,首先说明一点,这是 第一次去根据name来查询张三 ,这个时候呢,我们就会去访问数据库,去获取name是张三的数据,拿到张三后, 它会把张三又放进了Sqlssion对象中去了 ,Sqlssion对象存在内存中; 也就是说,我们第一次查完后,我们会将张三这个数据从数据库中获取一下,获取后放到缓存里面,此时的缓存就在内存里面,具体的来说,它就在Sqlsession对象里面; 上述操作如下图: 如果,再有一次或再有N次来查询这个张三,我就不需要去访问数据库了,因为我在缓存里面已经有了,如果你再要拿这个张三,直接直接从缓存里面去拿; 因此呢,我们可以发现, 缓存可以减少数据库的访问 ; 我们都知道,数据库的打开与关闭均比较费性能,所以

MyBatis:查询缓存

江枫思渺然 提交于 2019-12-02 06:23:27
查询缓存 Mybatis一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。当一个sqlSession结束后该sqlSession中的一级缓存也就不存在了。Mybatis默认开启一级缓存。 Mybatis二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace,不同的sqlSession两次执行相同namespace下的sql语句且向sql中传递参数也相同即最终执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。Mybatis默认没有开启二级缓存需要在setting全局参数中配置开启二级缓存。 一级缓存 一级缓存区域是根据SqlSession为单位划分的。 每次查询会先从缓存区域找,如果找不到从数据库查询,查询到数据将数据写入缓存。 Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句,value为从查询出来映射生成的java对象。 sqlSession执行insert、update、delete等操作commit提交后会清空缓存区域。 二级缓存

寄存器vs缓存vs硬盘

喜欢而已 提交于 2019-12-02 04:43:11
如下配置:一个处理器cpu,六个核。处理器速度为2.2GHz即电流每秒钟可以振荡22亿次。二级缓存256KB,每个核都独自有一个二级缓存;三级缓存9M,是六个核共享的。使用了超线程技术,所以总共有十二个核,即十二个线程 来源: https://www.cnblogs.com/shengulong/p/11730226.html

redis作为hibernate的二级缓存

六月ゝ 毕业季﹏ 提交于 2019-12-01 20:37:30
hibernate的二级缓存有好多,像ehcache。不过项目的缓存使用的是redis,而redis官方没有实现hibernate的二级缓存接口,只得自己实现。看看公司的高手如何做的吧。 先看配置: <!-- entityManagerFactory --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" depends-on="cacheManagerFactory"> ... <property name="jpaProperties"> <props> ... <prop key="hibernate.cache.use_second_level_cache">true</prop> <!-- <prop key="hibernate.cache.use_query_cache">true</prop> --> <prop key="hibernate.cache.region.factory_class">xxx.xxx.framework.cache.hibernate.CacheRegionFactory</prop> ... </props> </property> </bean> <!-- cache

使用SMM框架开发企业级应用-----延迟加载及缓存

徘徊边缘 提交于 2019-12-01 15:00:19
延迟加载   什么是延迟加载:       MyBatis中的延迟加载,也称为懒加载,是指在进行表的关联查询时,按照设置延迟规则推迟对关联对象的select查询。例如在进行一对多查询的时候,只查询出一方,当程序中需要多方的数据时,mybatis再发出sql语句进行查询,这样子延迟加载就可以的减少数据库压力。MyBatis 的延迟加载只是对关联对象的查询有迟延设置,对于主加载对象都是直接执行查询语句的。   加载时机:       直接加载: 执行完对主加载对象的 select 语句,马上执行对关联对象的 select 查询。     侵入式延迟加载: 执行对主加载对象的查询时,不会执行对关联对象的查询。但 当要访问主加载对象的详情属性时,就会马上执行关联对象的select查询。     深度加载: 执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的 select 查询。 一、延迟加载 1.主对象的加载: 根本没有延迟的概念,都是直接加载。 2.关联对象的加载时机: 01.直接加载: 访问主对象,关联对象也要加载 02.侵入式延迟: 访问主对象,并不加载关联对象 访问主对象属性的属性的时候,关联对象会被加载 03.深度延迟 访问主对象,并不加载关联对象

缓存

我只是一个虾纸丫 提交于 2019-12-01 12:50:57
二十 . 一级缓存 查询缓存的使用,主要是 为了提高查询访问速度 。将用户对同一数据的重复查询过程简化,不再每次均从数据库查询获取结果数据,从而提高访问速度。 一.缓存的划分 根据缓存区的作用域与生命周期课划分为: 一级缓存(大配置文件 setting 节点 name 属性) 二级缓存 二.缓存说明 MyBatis 查询缓存的作用域是根据映射文件的 namespace 划分的,相同的 namespace 的 mapper 查询数据放在同一个缓存区域。不同 namespace 下的数据互不干扰。 无论是一级缓存还是二级缓存,都是按照 namespace 进行分别存放的。 一级、二级缓存的不同之处在于, SqlSession 一旦关闭,则 SqlSession 中的数据将不存在,即一级缓存就不复存在。而二级缓存的生命周期与整个应用同步,与 SqlSession 是否关闭无关。换句话说,一级缓存是在同一线程 ( 同一 SqlSession) 间共享数据,而二级缓存是在不同线程 ( 不同的 SqlSession) 间共享数据。 三.一级缓存存在证明 同一个会话( SqlSession )执行两次相同的 SQL ,观察控制台发送了几条 SQL 缓存的底层实现是一个 Map , Map 的 key 是查询的依据,使用的 ORM 框架不同,查询依据也不同, Mybatis 查询依据为 SQL 的