在使用hibernate开发过程中,让我一直感到奇怪的是为什么缓存是如此的让人不顺心。对于update操作频繁的项目更是噩梦。这和我对缓存的理解有很大的出入。
我的想法有2点:
1、数据库是大海,缓存是池塘。如果我抓了4条鱼到池塘里面去,为什么我一直要做这么一件事情:把鱼抓到池塘里面过一段时间又放回大海,过一段时间又抓到池塘里面去。这样真傻。还有一个诡异的问题,鱼被抓到池塘里面了,大海里面的鱼是哪来的?
2、如果我要抓所有的鲶鱼,难道我只去池塘抓?如果我怎么才能知道池塘的鱼是不是就是所有的鲶鱼了,这个时候必须去大海里面再捞一捞。必须去大海里面一次又一次的捞?要池塘又是干嘛的?
freyja的做法:
1、在freyja里面鱼只有一条,要么在池塘要么在海里面。freyja用hashMap来管理缓存(ehcache)
2、get方式获取到的都是优先缓存内的值,取不到才会去发送sql并且放入cache中。
find()方法会发送sql去查找id,然后遍历缓存,如果缓存中存在者返回缓存中的值,否则取数据库中的。
executeUpdate()方法会直接update数据库,并且会select id 找出涉及到的表的id然后用el工具更新缓存中的值。来维护缓存。
将要实现的cache能力:
3、第一次发送sql会查询出一个记录集,第二次发送sql着直接取缓存中的内容。难点是,如果其中一条记录的条件变化,如何完成这个处理?我的想法是一条记录保存所有缓存他得key,一旦update操作则让其缓存失效(这个是简单做法,复杂做法是根据条件再次判断是否让缓存失效。)
4、(这是我最喜欢的一个功能)no update。
这个功能的特点就是在update(user)的时候不会去发送sql update数据库。也就是第一点所说的,鱼在池塘就不去理会大海。这个功能的思路大概有了,正在施工中。但是工作量很大,而且效率怎么样不得而之。总之,这是自寻死路。
对于现在的freyja来说不支持分布式,也许以后会去考虑,一旦支持了分布式那么我的第一个理念就有出入了。
其实还有最大的一个问题:事务
http://freyja.iteye.com/blog/1178182
事务的特性就是为了让一个人不要在看书的时候听音乐。因为同时做2件事的时候容易出问题。事务还是很有存在的必要的,但是freyja的结构让事务失去了作用。只有一个对象的freyja可以在事物里面的数据被事物外的数据修改。
freyja对事物的处理是,在get()实体的时候根据事物的id为key把结果集放入一个map作为副本,在出错的时候”回滚“,事物结束的时候remove key。这部分还在完善中。
在简单的测试中,hibernate一级缓存情况下的select update 操作freyja和hibernate效率相当。(因为freyja本身就是一个大的一级缓存)。但是到了重要的二级缓存里面hibernate和freyja没有可比性了。
如这么一个测试:@Test
public void testFind() {
long l1 = System.currentTimeMillis();
for (int i = 0; i < 2000; i++) {
userService.testFind();
}
long l2 = System.currentTimeMillis();
System.out.println("freyja find() 5000个对象耗时:" + (l2 - l1) / 1000);
}
public void testFind() {
for (int i = 0; i < 10; i++) {
List<User> list = baseDAO.find(User.class, "level < ?", i);
}
}
模拟二级缓存环境,数据源用的是同一个,hibernate的二级缓存开启查询缓存关闭(难道开启会好点?)
hibernate find() 5000个对象耗时:11 (500*10)
hibernate find() 5000个对象耗时:20 (1000*10)
hibernate find() 5000个对象耗时:40 (2000*10)
freyja find() 5000个对象耗时:7 (500*10)
freyja find() 5000个对象耗时:13 (1000*10)
freyja find() 5000个对象耗时:25 (2000*10)
分别是2000调用、1000次调用和500次调用。User表里面有5000条记录,level为1-5000;
这个差距大概体现在hibernate每次从缓存中提取结果需要序列化的原因。
还是等完全施工完毕再全面的系统测试一次比较好。
那个时候hibernate有它的一套完备的体系,freyja则有自己的原生sql+cache支持。
分享到:
相关推荐
Maven坐标:javax.cache:cache-api:1.1.1; 标签:javax、cache、api、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...
【标题】:“Lab #8: Cache” 在计算机科学领域,Cache是硬件层面的关键技术,用于提升数据存取速度。此实验“Lab #8: Cache”旨在深入理解和掌握Cache的工作原理及其对系统性能的影响。在本实验中,我们将探索...
存储器系统是计算机硬件的重要组成部分,它负责存储和管理数据及指令,以便CPU能快速访问。本主题将深入探讨三个关键层次的存储器:Cache...理解这些层次的特性和交互对于系统设计、性能优化和问题排查都具有重要意义。
【实验四:Cache性能分析】 本实验主要目的是深入理解Cache的工作原理,以及其容量、相联度、块大小等因素如何影响性能。实验中,我们利用SimpleScalar模拟器,通过一系列参数调整来研究Cache的失效机制。 1. **...
Oracle Cache Fusion 原理介绍 Oracle Cache Fusion 是 Oracle Real Application Clusters(RAC)的一种高级技术,旨在提高集群环境中的数据块传输效率和可靠性。 Cache Fusion 可以实现在集群中的数据块高速传输、...
本实验的主要目的是为了加深对 Cache 的基本概念、基本组成结构以及基本工作原理的理解,了解 Cache 的容量、相联度、块大小对 Cache 性能的影响,掌握降低 Cache 失效率的方法,了解 Cache 失效的产生原因,理解 ...
Maven坐标:javax.cache:cache-api:1.1.1; 标签:javax、cache、api、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码...
内存系统分为几个层次,包括高速缓存(Cache)、动态随机存取存储器(DRAM)和磁盘存储。每层都有其独特的特性和功能,并且在整个存储体系中扮演着各自的角色。 缓存是计算机内存系统中最接近CPU的部分,它用于临时...
- **JBoss Cache**:功能强大的Cache实现,支持多种特性,包括分布式Cache、多级Cache和集群支持,提供锁和事务处理。 **memcached的特性** - **多语言客户端API**:提供多种编程语言的客户端接口,方便不同环境下...
实验四“Cache控制器设计1”主要目标是让学生理解和掌握Cache控制器的工作原理以及设计方法,同时通过实际编程实现Cache控制器的功能。在这个实验中,学生需要编写各个子模块的代码,并进行测试,确保Cache控制器能...
在CGI-Cache-1.4200这个版本中,可能包含了一些新特性、改进或修复的bug。具体细节需要查看模块的文档或变更日志来了解。为了使用这个模块,开发者需要具备一定的Perl编程基础,理解如何在CGI脚本中引入和配置CGI::...
2. InterSystems Cache:Cache是一个高性能、实时的多模式数据库,支持对象-关系数据模型,常用于构建高性能的应用系统,如电子健康记录和金融服务。 3. JDBC连接Cache:使用JDBC连接Cache数据库需要引入特定的JDBC...
File::Cache 是一个 perl 模块,它允许通过文件系统跨进程共享对象数据。 现在不鼓励使用 File::Cache,而是支持 http://sourceforge.net/projects/perl-cache/ 上的新 Cache::Cache 项目。
- **DRAM的工作原理**:DRAM通过改变电容器上的电压来表示二进制位(0或1)。为了保持数据,需要定期给电容器充电,这一过程称为刷新。 - **DDR技术**:DDR(Double Data Rate)是DRAM的一种常见形式,它可以在每个时钟...
#### 二、CACHE的关键特性 - **多值存储(MultiValue)**:CACHE支持多值存储模型,这种模型允许在一个记录中存储多个值,非常适合快速访问和处理大量数据。 - **全局变量(Global Variables)**:这是CACHE的一个独特...
在计算机系统中,缓存(Cache)是一种用于提高数据访问速度的技术。它通过存储最近频繁使用的数据,减少了处理器等待主存响应的时间。本单元测试主要涉及了Cache的替换算法和写策略,这些都是优化计算机性能的关键...
1. Cache 模拟器使用 newarray 二维数组模拟 Cache 2. 在直接映射和全相连映射中,newarray[index][0] 用来表示 Cache 中 index 对应记录的有效位,newarray[index][1] 代表 Cache 中 index 对应记录的 tag 字段 3. ...
等待事件row cache lock,latch row cache objects处理过程
从提供的文件内容来看,我们可以提取以下关于Cache数据库的知识点: 1. Cache数据库基础概念:Cache是InterSystems公司开发的一个高性能的对象数据库,适合处理大量数据和复杂数据结构,通常用于医疗、金融等行业的...