`
longxiaoyan
  • 浏览: 75451 次
  • 性别: Icon_minigender_1
  • 来自: 桂-京
社区版块
存档分类
最新评论

Ehcache二级缓存,查询缓存,分布式缓存总结

阅读更多
二级缓存和查询缓存都相当于一个map
二级缓存缓存的keyidvalue为实体对象。一般load(),iterate()使用到二级缓存,list()需要结合查询缓存使用。iterate()和list()区别如下:
iterate()不需要开启查询缓存,它首先发出一个sqlselect s.id from Student s去数据库把id属性列表取出来,然后再根据id列表一个一个load(),如果缓存有从缓存取,如果缓存没有就从数据库取:select s.id,s.name,s.classid from     Student s where s.id=?,取出后再存入二级缓存。Iterate总会发出取id列表的语句。
List()需要开启查询缓存,它首先发出一个sqlselect s.id,s.name,s.classid from Student s…”去数据库取出所有相关实体,并将这些实体存入二级缓存,将此sql语句及一些相关信息作为keyid列表作为值,第二次查询这条语句时就会去根据sql语句及相关信息去key里找,如果有就会把id列表取出一个一个load(),接下来就和iterate一样了。List一般只有第一次发发出取实体列表的语句,以后的id列表就会去查询缓存取id列表,不会再发出sql语句。
 
前提:执行同一hql语句,如:select s from Student s
1.  关闭查询缓存,开启二级缓存时:
第二次查询属性时iterate只会发出获取id列表的sqllist会发出和第一次一样的请求实体的sql
2.  开启查询缓存,开启二级缓存
第二次查询属性时iterate只会发出获取id列表的sqllist不发sql
以上说明iterate只和二级缓存有关,list和二级缓存和查询缓存都有关。
 
查询缓存的key是一个QueryKey(其属性如下),valueid集合。
    public class QueryKey implements Serializable {
       private final String sqlQueryString;//sql语句
       private final Type[] types;
       private final Object[] values;
       private final Integer firstRow;//要查询的起始数
       private final Integer maxRows;//要查询的个数
       private final Map namedParameters;
       private final EntityMode entityMode;
       private final Set filters;
       private final int hashCode;
       ......
    }
果以上属性中有一个不同,查询缓存就不会命中。使用list()时,如果是第一次,查询缓存取出实体列表,然后从实体列表中提取出id列表作为value。如果是查询缓存命中,就会根据QueryKey取出id列表,然后根据id列表去二级缓存中load()对象,如果二级缓存中没有哪个对象,就会根据id去数据库查询,二级缓存中没有n个对象就会去数据库查询n次:select p from pojo p where id=?,因此就会有机会出现传说中n+1问题。
在查询缓存中,查询缓存缓存普通属性,即对于属性的查询,value值为要查询的属性列表,对于实体,value值为实体的id列表,而对于属性的查询由于从value中直接可以查出就不会用到二级缓存,但对于实体的查询,必须结合二级缓存使用。下面对此进行说明:
前提:执行同一hql语句,如:select s from Student sselect s.name from Student s
1.  开启查询缓存,关闭二级缓存时:
第二次查询属性时不会发出sql,第一次查询实体时会发出sql
2.  开启查询缓存,开启二级缓存
第二次查询属性,实体时都不发sql
 
 
对于Ehcache分布式缓存,好像查询缓存不能更新:
在同一系统中,当用Hibernate的方式修改表数据(save,update,delete等等),这时EhCache会自动把缓存中关于此表的所有缓存全部删除掉(这样能达到同步)。但对于两个以上系统部署在不同机子上,并在他们之间配置了ehcache的分布式缓存,当A系统修改表数据(save,update,delete)后,b系统会更新查询缓存吗?
答:好像是不能的,即ehcache的分布式缓存对查询缓存无效。(我在项目中配置了Ehcache的分布式缓存,二级缓存可以生效,但查询缓存不能更新。是不是一个系统中的Hibernate不能够识别其他系统中hibernate是否进行了save,update,delete操作?而Ehcache也没对此进行整合,望知道的大牛给说一下。)
3
0
分享到:
评论

相关推荐

    分布式缓存.docx

    介绍ehcache做jvm缓存,ehcache做分布式缓存,redis做分布式缓存,redis分片集群,redis哨兵,redis基本数据,redis主从复制,redis和ehcache的二级缓存,redis雪崩效应,redis缓存穿透(整个环境搭建基于Centos,代码...

    smart-cache:基于Ehcache和Redis的Java分布式二级缓存,除了基本操作外,还可以实现所有级别的多计算机集群的缓存监视和获取。

    智能缓存介绍基于Ehcache2和Redis的Java分布式二级缓存,除了基本操作外,还可以实现所有级别的多计算机集群的缓存监视和获取。 将独立缓存与特定结构中的Redis缓存系统同步,以实现全局缓存的统一管理。 动态地使用...

    Java架构基础知识(二)缓存.svg

    缓存是我们在开发中经常遇到要解决的问题,有页面缓存、应用级别的缓存,应用级缓存又分为本地缓存、分布式缓存,在本地缓存中,常用的有成员变量或局部变量实现、静态变量实现、Ehcache、Guava组件、Spring注解缓存...

    Ehcache User Guide 1.5

    Ehcache用户指南。版本号 V1.5 Hibernate的默认二级缓存的实现者,支持分布式缓存。

    分布式缓存架构1.docx

    springboot搭建ehcache+redis的二级缓存

    ehcache.rar ehcache-core-2.6.10.jar依赖包

    MyBatiesEhCache二级缓存 Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和...

    缓存技术详解

    缓存ehcache开源框架,2. 简单.... 可以通过RMI、可插入API等方式进行分布式缓存 7. 具有缓存和缓存管理器的侦听接口 8. 支持多缓存管理器实例,以及一个实例的多个缓存区域 9. 提供Hibernate的缓存实现

    基于 SpringBoot 2.3.4 版本的入门 Demo 教程

    Spring Boot JPA 二级缓存(ehcache) Spring Boot Hikari 连接池详解 Spring Boot Caffeine 本地缓存 Spring Boot Redis 缓存 Spring Boot Redis 分布式锁 Spring Boot Event 事件发布与监听 Spring Boot 集成 ...

    Jboot是专为大型分布式项目和微服务而生.rar

    Jboot 是一个基于 JFinal、JFinal-Undertow、Dubbo、Seata、Sentinel、ShardingSphere、Nacos 等开发的微服务框架, 帮助开发者降低微服务开发门槛。...6、基于 EhCache 和 Redis 的分布式二级缓存

    毕业设计早餐外卖微信小程序课程设计源代码

    配置使用Ehcache作为页面的第二级缓存,并设置LRU清除策略 选用RabbitMQ中间件,异步保存聊天消息、记录订单的详细信息,并配置每次从队列中消费一条消息;并采用KeepAlive+Haproxy 使用FastDFS+Nginx的Http服务保存...

    趁早(quickearly)早餐外卖微信小程序-方便面的毕业设计.zip

    配置使用Ehcache作为页面的第二级缓存,并设置LRU清除策略 选用RabbitMQ中间件,异步保存聊天消息、记录订单的详细信息,并配置每次从队列中消费一条消息;并采用KeepAlive+Haproxy 使用FastDFS+Nginx的Http服务保存...

    spring-dubbo-service:微服务spring dubbo项目:dubbo rpc;德鲁伊数据源连接池; mybatis配置集成,多数据源; jmx监控MBean;定时任务; aop; ftp;测试;指标监控;参数验证;跨域处理; shiro权限控制; consul服务注册,发现; redis分布式锁; SPI服务机制; cat监控; netty服务代理; websocket; disconf; mongodb集成;休息; docker; fescar

    配置druid数据源监视: ehcache二级缓存配置xml注解ftp服务; Excel相关处理; jmx监控MBean测试; ArchUnit参数验证;跨域处理; shiro权限控制;静态资源,“ /”映射服务启动注册到consul;并测试获取redis服务,...

    趁早(quickearly)B2C早餐外卖微信小程序

    配置使用Ehcache作为页面的第二级缓存,并设置LRU清除策略 选用RabbitMQ中间件,异步保存聊天消息、记录订单的详细信息,并配置每次从队列中消费一条消息;并采用KeepAlive+Haproxy 使用FastDFS+Nginx的Http服务保存...

    Jboot微服务框架-其他

     分布式二级缓存ehredis 8、分布式session 9、分布式锁 10、任务调度  cron4j  ScheduledThreadPoolExecutor  分布式任务调度 11、调用监控 (基于metrics) 12、限流、降级、熔断机制(基于hystrix) 13、Open...

    jeesuite-libs-其他

    包括缓存(一二级缓存、自动缓存管理)、队列、分布式定时任务、文件服务(七牛、阿里云OSS、fastDFS)、日志、搜索、代码生成、API网关、配置中心、统一认证平台、分布式锁、分布式事务、集成dubbo、spring boot支持、...

    web开发常用jar

    Hibernate可以使用不同cache缓存工具作为二级缓存。EHCache是缺省的cache缓存工具。如果没有其它的可选缓存工具,则为必需的。 hibernate3.jar hibernate3的核心类库。 itext.jar 是用于生成PDF文档的一个...

    java开发常用jar包

    Hibernate可以使用不同cache缓存工具作为二级缓存。EHCache是缺省的cache缓存工具。如果没有其它的可选缓存工具,则为必需的。 hibernate3.jar hibernate3的核心类库。 itext.jar 是用于生成PDF文档的一个java...

    java开源包1

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包11

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包2

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

Global site tag (gtag.js) - Google Analytics