`
sunshine518
  • 浏览: 45414 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate和Jive缓存策略的比较

阅读更多
一.基本概念

PO是持久化对象,他只是对物理数据实体的一种对象表示。

VO是值对象,准确地讲,他是业务对象。

FormBean只是HTML表单的封装,起到在控制层弱化的request中存储数据的作用,将request的get方法转

变为对象的存取值。





二.缓存策略比较

Jive

1.Jive的缓存策略的过程描述:

(1)条件查询的时候,Jive用 select id from table_name where …. (只选择ID字段)这样的SQL语句查询数据库,来获得一个ID列表。



(2) Jive根据ID列表中的每个ID,首先查看缓存中是否存在对应ID的数据对象:假如存在,那么直接取出,加入到 结果列表中;假如不存在,那么通过一条select * from table_name where id = {ID value} 这样的SQL查询数据库,取出对应的数据对象,放入到结果列表,并把这个数据对象按照ID放入到缓存中。



(3) ID查询的时候,Jive执行类似第(2)步的过程,先从缓存中查找该ID,查不到,再查询数据库,然后把结果放入到缓存。



(4) 删除、更新、增加数据的时候,同时更新缓存。



2.Jive缓存策略的长处:

(1) ID查询的时候,假如该ID已存在于缓存中,那么能够直接取出。节省了一条数据库查询。



(2) 当多次条件查询的结果集相交的情况下,交集里面的数据对象不用重复从数据库整个获取,直接从缓存中获取即可。比如,第一次查询的ID列表为{1, 2},然后根据ID列表的ID从数据库中一个一个取出数据对象,结果集为{a(id = 1), b(id = 2)}。下一次查询的ID列表为{2, 3},由于ID = 2的数据对象已存在于缓存中,那么只要从数据库中取出ID = 3的数据对象即可。



3.Jive缓存策略的缺点:

(1) 在根据条件查找数据对象列表的过程中,DAO的第(1)步用来获得ID列表的那一次数据库查询,是必不可少的。



(2) 假如第(1)步返回的ID列表中有n个ID,在最坏的命中率(缓存中一个对应ID都没有)情况下,Jive还要再查询n次数据库。最坏情况下,共需要n + 1数据库查询。

Hibernate

Hibernate用Session类包装了数据库连接从打开到关闭的过程。Session内部维护一个数据对象集合,包括了本Session内选取的、操作的数据对象。这称为Session内部缓存,是Hibernate的第一级最快缓存,属于Hibernate的既定行为,无需进行配置。

Session的生命期很短,存在于Session内部的第一级最快缓存的生命期当然也很短,命中率自然也很低。当然,这个Session内部缓存的主要作用是保持Session内部数据状态同步。假如需要跨Session的命中率较高的全局缓存,那么必须对Hibernate进行二级缓存配置。一般来说,同样数据类型(Class)的数据对象,共用一个二级缓存(或其中的同一块)。



1.Hibernate二级缓存策略的过程描述:

(1)条件查询的时候,总是发出一条select * from table_name where …. (选择任何字段)这样的SQL语句查询数据库,一次获得任何的数据对象。



(2) 把获得的任何数据对象根据ID放入到第二级缓存中。



(3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,假如配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。



(4) 删除、更新、增加数据的时候,同时更新缓存。



2.Hibernate二级缓存策略的长处:

(1) 具备Jive缓存策略同样的第(1)条长处:ID查询的时候,假如该ID已存在于缓存中,那么能够直接取出。节省了一条数据库查询。



(2) 不具备Jive缓存策略的第(2)条缺点,即hibernate不会有最坏情况下的 n + 1次数据库查询。



3.Hibernate二级缓存策略的缺点:

(1) 同Jive缓存策略的第(1)条缺点相同,条件查询的时候,第(1)步的数据库查询语句是不可少的。而且Hibernate选择任何的字段,比只选择ID字段花费的时间和空间都多。



(2) 不具备Jive缓存策略的第(2)条长处。条件查询的时候,必须把数据库对象从数据库中整个取出,即使该数据库的ID已存在于缓存中。



Hibernate的Query缓存策略

能够看到,Jive缓存和Hibernate的二级缓存策略,都只是针对于ID查询的缓存策略,对于条件查询则毫无作用。(尽管Jive缓存的第(2)个长处,能够避免重复从数据库获取同一个ID对应的数据对象,但select id from …这条数据库查询是每次条件查询都必不可少的)。



为此,Hibernate提供了针对条件查询的Query缓存。



1.Hibernate的Query缓存策略的过程描述:

(1) 条件查询的请求一般都包括如下信息:SQL, SQL需要的参数,记录范围(起始位置rowStart,最大记录个数maxRows),等。



(2) Hibernate首先根据这些信息组成一个Query Key,根据这个Query Key到Query缓存中查找对应的结果列表。假如存在,那么返回这个结果列表;假如不存在,查询数据库,获取结果列表,把整个结果列表根据Query Key放入到Query缓存中。



(3) Query Key中的SQL涉及到一些表名,假如这些表的任何数据发生修改、删除、增加等操作,这些相关的Query Key都要从缓存中清空。



2.Hibernate的Query缓存策略的长处

(1) 条件查询的时候,假如Query Key已存在于缓存,那么无需再查询数据库。命中的情况下,一次数据库查询也无需。



3.Hibernate的Query缓存策略的缺点

(1) 条件查询涉及到的表中,假如有任何一条记录增加、删除、或改变,那么缓存中任何和该表相关的Query Key都会失效。

比如,有这样几组Query Key,他们的SQL里面都包括table1。



SQL = select * from table1 where c1 = ? …., parameter = 1, rowStart = 11, maxRows = 20.

SQL = select * from table1 where c1 = ? …., parameter = 1, rowStart = 21, maxRows = 20.

SQL = select * from table1 where c1 = ? ….., parameter = 2, rowStart = 11, maxRows = 20.

SQL = select * from table1 where c1 = ? ….., parameter = 2, rowStart = 11, maxRows = 20.

SQL = select * from table1 where c2 = ? …., parameter = ‘abc’, rowStart = 11, maxRows = 20.



当table1的任何数据对象(任何字段)改变、增加、删除的时候,这些Query Key对应的结果集都不能确保没有发生变化。很难做到根据数据对象的改变精确判断哪些Query Key对应的结果集受到影响。最简单的实现方法,就是清空任何SQL包含table1的Query Key。



(2) Query缓存中,Query Key对应的是数据对象列表,假如不同的Query Key对应的数据对象列表有交集,那么,交集部分的数据对象就是重复存储的。



比如,Query Key 1对应的数据对象列表为{a(id = 1), b(id = 2)},Query Key 2对应的数据对象列表为{a(id = 1), c(id = 3)},这个a就在两个List同时存在了两份。



4.二级缓存和Query缓存同步的困惑

假如,Query缓存中,一个Query Key对应的结果列表为{a (id = 1) , b (id = 2), c (id = 3)}; 二级缓存里面有也id = 1对应的数据对象a。



这两个数据对象a之间是什么关系?能够保持状态同步吗?我阅读Hibernate的相关源码,没有发现两个缓存之间的这种同步关系。或两者之间毫无关系。就像我上面所说的,只要表数据发生变化,相关的Query Key都要被清空。所以不用考虑同步问题?
分享到:
评论

相关推荐

    JAVA缓存研究之剖析Jive的缓存机制

    JAVA缓存研究之剖析Jive的缓存机制JAVA缓存研究之剖析Jive的缓存机制

    缓存机制(Jive缓存机制的实现)

    - **LinkedList**:辅助实现缓存项的顺序管理,例如最近最少使用(LRU)策略。 - **LongHashMap与LongLinkedList** - **LongHashMap**:自定义实现的哈希表,键值类型为`Long`,适用于特定场景下的高性能需求。...

    学习JavaEE的两个著名工程PetStore和Jive论坛二合一

    在JavaEE的学习过程中,有两个著名的示例项目,即PetStore和Jive论坛,这两个项目都是JavaEE开发的经典案例,有助于初学者理解并掌握JavaEE的核心概念和技术。 PetStore项目: 1. **MVC设计模式**:PetStore项目...

    最早最经典的Jive论坛开源 源码

    这些功能的实现涉及了多线程、缓存策略以及算法设计等多个方面。例如,为了提高搜索效率,Jive可能采用了全文索引技术,如Lucene,来快速定位到相关帖子。而通知机制则涉及到异步处理和消息队列,以确保即使在高并发...

    Jive java版源码

    在Jive源码中,我们可以看到许多经典的设计模式,如单例模式、工厂模式、观察者模式、装饰器模式和策略模式等。例如,单例模式在全局配置或线程池管理中广泛应用,保证了在整个系统中只有一个实例存在;工厂模式用于...

    jive安装实例jive安装实例jive安装实例

    需要注意的是,整个过程中涉及到的各个软件版本都比较老旧,因此建议在实际应用中考虑使用更新的版本以获得更好的兼容性和安全性支持。此外,对于新手来说,可能还会遇到各种问题,比如配置错误、驱动不匹配等,这些...

    Jive的安装指导。

    ### Jive(Jdon)安装详细指导 #### 一、前言 Jive是一款知名的开源社区软件,被广泛应用于企业内部沟通平台以及外部客户互动平台。本文档将详细讲解如何在Linux环境下安装配置Jive,包括数据库设置、Tomcat服务器...

    jive源码

    java jive缓存机制源码

    jive 2.5 源代码

    4. **库文件**:包含Jive依赖的第三方库,如Spring、Hibernate等,这些库为Jive提供了框架支持和服务功能。 5. **构建脚本**:例如Ant或Maven脚本,用于编译源代码、打包和部署Jive应用。 对于初学者,理解Jive 2.5...

    jive论坛源码,jive项目源码,jive源码

    jive论坛源码,jive项目源码,jive源码,Jive是国外一个非常著名的BBS程序,完全开放源码.jive论坛源码,jive项目源码,jive源码,Jive是国外一个非常著名的BBS程序,完全开放源码.jive论坛源码,jive项目源码,jive源码,...

    最早最经典的jive论坛源代码

    7. **性能优化**:源代码中可能包含对服务器性能优化的策略,如使用缓存技术、负载均衡、静态资源处理等,这些都是提高大型社区应用性能的关键。 8. **可扩展性**:作为一款开源软件,Jive论坛的源代码展示了一个可...

    Jive源代码.zip

    在性能优化方面,Jive源代码展示了缓存机制的运用,如使用Ehcache或Redis进行数据缓存,减少数据库查询的次数,提高系统响应速度。同时,Jive还可能利用负载均衡和分布式计算技术,如Hadoop或Spark,来处理大规模...

    java学习必学系统--jive

    Jive是一款强大的企业社交网络平台,它为企业提供了内部协作、沟通和知识管理的解决方案。在Java开发者的学习路径中,掌握Jive不仅能提升你的Web开发技能,还能拓宽你在企业级应用开发领域的视野。 首先,我们来...

    jive.chm

    2 jcs学习笔记 3 关于Hibernate的Cache问题 4 用缓冲技术提高JSP应用的性能和稳定性 5 SwarmCache入门 <br> 源代码研究 1 Jive中的全局配置 2 Jive源代码情景分析-index....

    Jive--SourceFile

    总的来说,Jive的源码提供了一个全面的学习平台,涵盖了Java Web开发的多个方面,包括前端、后端、数据库、构建工具和部署策略。通过深入研究,开发者不仅可以提高自身的技术水平,还能为未来的企业级项目积累宝贵...

    Jive源程序

    除了设计模式,Jive源代码还可能包含对Java核心库和框架的高级使用,如Spring框架的依赖注入,Hibernate的持久化操作,以及Servlet和JSP的Web开发技术。通过分析这些代码,你可以提升对Java Web开发的理解。 1. **...

    Jive论坛1.2.4版

    Jive论坛的优点 是由于采用缓冲机制,可以承受巨大访问量,同时能保持快速反应,在国外站点采用很多。 主要功能如下: 快速的缓存功能,将经常访问的帖子保存在内存中,实现快速访问, 可通过Web管理界面动态...

    jive的源代码

    6. **缓存策略**:为了提高性能,Jive可能会使用缓存技术,如Ehcache或Redis。研究源码中的缓存机制可以帮助你理解何时以及如何使用缓存来优化应用性能。 7. **RESTful API**:现代Web应用往往需要提供RESTful接口...

    Jive论坛原代码.rar

    在用户管理中,Jive论坛可能采用了策略模式,为不同类型的用户提供不同的服务策略,如普通用户、管理员、版主等。此外,可能会用到代理模式,为用户操作提供缓存或者安全过滤等功能。 在论坛版块和主题发布部分,...

Global site tag (gtag.js) - Google Analytics