在线182人
首页
主题表
培训咨询
标签
查搜
注册
登陆
用户
自动登陆
密码
新用户注册
忘记密码?
首页
»
论坛
»
开源项目大家谈
上一主题
如题,请高手赐教
下一主题
交个朋友,Q Q号码:570659699 1,采用o/r mapping,友好的分页查询 2,编程接口非常友好,绝对比hibernate让您更感亲切、简洁 3,采用可配置连接池(DBPC,C3P0..
Go
共有
11
回复(
1
页) 阅读1193次
前往下页:
jjd
发表文章:
注册时间: 2006年03月31日
悄悄话
个人博客
当前离线
【原创】Hibernate的缓存机制介绍
2006年03月02日 13:35
hibernate
缓存cache
数据库
高性能
4
顶一下
缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从
缓存
读写数据,在特定的时刻或事件会同步
缓存
和物理数据源的数据。
缓存的介质一般是内存,所以读写速度很快。但如果
缓存
中存放的数据量非常大时,也会用硬盘作为
缓存
介质。缓存的实现不仅仅要考虑存储的介质,还要考虑到管理
缓存
的并发访问和
缓存
数据的生命周期。
Hibernate的
缓存
包括Session的
缓存
和SessionFactory的
缓存
,其中SessionFactory的
缓存
又可以分为两类:内置
缓存
和外置
缓存
。Session的
缓存
是内置的,不能被卸载,也被称为Hibernate的第一级
缓存
。SessionFactory的内置
缓存
和Session的
缓存
在实现方式上比较相似,前者是SessionFactory对象的一些集合属性包含的数据,后者是指Session的一些集合属性包含的数据。SessionFactory的内置
缓存
中存放了映射元数据和预定义SQL语句,映射元数据是映射文件中数据的拷贝,而预定义SQL语句是在Hibernate初始化阶段根据映射元数据推导出来,SessionFactory的内置
缓存
是只读的,应用程序不能修改
缓存
中的映射元数据和预定义SQL语句,因此SessionFactory不需要进行内置
缓存
与映射文件的同步。SessionFactory的外置
缓存
是一个可配置的插件。在默认情况下,SessionFactory不会启用这个插件。外置
缓存
的数据是数据库数据的拷贝,外置
缓存
的介质可以是内存或者硬盘。SessionFactory的外置
缓存
也被称为Hibernate的第二级
缓存
。
Hibernate的这两级
缓存
都位于持久化层,存放的都是数据库数据的拷贝,那么它们之间的区别是什么呢?为了理解二者的区别,需要深入理解持久化层的
缓存
的两个特性:缓存的范围和
缓存
的并发访问策略。
持久化层的
缓存
的范围
缓存的范围决定了
缓存
的生命周期以及可以被谁访问。缓存的范围分为三类。
1
事务
范围:缓存只能被当前
事务
访问。缓存的生命周期依赖于
事务
的生命周期,当
事务
结束时,缓存也就结束生命周期。在此范围下,缓存的介质是内存。事务可以是数据库
事务
或者应用
事务
,每个
事务
都有独自的
缓存
,缓存内的数据通常采用相互关联的的对象形式。
2 进程范围:缓存被进程内的所有
事务
共享。这些
事务
有可能是并发访问
缓存
,因此必须对
缓存
采取必要的
事务
隔离机制。缓存的生命周期依赖于进程的生命周期,进程结束时,缓存也就结束了生命周期。进程范围的
缓存
可能会存放大量的数据,所以存放的介质可以是内存或硬盘。缓存内的数据既可以是相互关联的对象形式也可以是对象的松散数据形式。松散的对象数据形式有点类似于对象的序列化数据,但是对象分解为松散的算法比对象序列化的算法要求更快。
3
集群
范围:在
集群
环境中,缓存被一个机器或者多个机器的进程共享。缓存中的数据被复制到
集群
环境中的每个进程节点,进程间通过远程通信来保证
缓存
中的数据的一致性,缓存中的数据通常采用对象的松散数据形式。
对大多数应用来说,应该慎重地考虑是否需要使用
集群
范围的
缓存
,因为访问的速度不一定会比直接访问数据库数据的速度快多少。
持久化层可以提供多种范围的
缓存
。如果在
事务
范围的
缓存
中没有查到相应的数据,还可以到进程范围或
集群
范围的
缓存
内查询,如果还是没有查到,那么只有到数据库中查询。事务范围的
缓存
是持久化层的第一级
缓存
,通常它是必需的;进程范围或
集群
范围的
缓存
是持久化层的第二级
缓存
,通常是可选的。
持久化层的
缓存
的并发访问策略
当多个并发的
事务
同时访问持久化层的
缓存
的相同数据时,会引起并发问题,必须采用必要的
事务
隔离措施。
在进程范围或
集群
范围的
缓存
,即第二级
缓存
,会出现并发问题。因此可以设定以下四种类型的并发访问策略,每一种策略对应一种
事务
隔离级别。
事务型:仅仅在受管理环境中适用。它提供了Repeatable Read事务隔离级别。对于经常被读但很少修改的数据,可以采用这种隔离类型,因为它可以防止脏读和不可重复读这类的并发问题。
读写型:提供了Read Committed事务隔离级别。仅仅在非
集群
的环境中适用。对于经常被读但很少修改的数据,可以采用这种隔离类型,因为它可以防止脏读这类的并发问题。
非严格读写型:不保证
缓存
与数据库中数据的一致性。如果存在两个
事务
同时访问
缓存
中相同数据的可能,必须为该数据配置一个很短的数据过期时间,从而尽量避免脏读。对于极少被修改,并且允许偶尔脏读的数据,可以采用这种并发访问策略。
只读型:对于从来不会修改的数据,如参考数据,可以使用这种并发访问策略。
事务型并发访问策略是
事务
隔离级别最高,只读型的隔离级别最低。事务隔离级别越高,并发性能就越低。
什么样的数据适合存放到第二级
缓存
中?
点击查看全文
banq
发表文章: 11282
注册时间: 2002年08月03日
悄悄话
个人博客
当前离线
70人关注
Re: 【原创】Hibernate的缓存机制介绍
2006年03月02日 16:12
2
顶一下
很好文章,为方便Jdon读者和备用,我将下半段接下来,有意见告知我,谢谢:
什么样的数据适合存放到第二级
缓存
中?
1 很少被修改的数据
2 不是很重要的数据,允许出现偶尔并发的数据
3 不会被并发访问的数据
4 参考数据
不适合存放到第二级
缓存
的数据?
1 经常被修改的数据
2 财务数据,绝对不允许出现并发
3 与其他应用共享的数据。
Hibernate的二级
缓存
如前所述,Hibernate提供了两级
缓存
,第一级是Session的
缓存
。由于Session对象的生命周期通常对应一个数据库
事务
或者一个应用
事务
,因此它的
缓存
是
事务
范围的
缓存
。第一级
缓存
是必需的,不允许而且事实上也无法比卸除。在第一级
缓存
中,持久化类的每个实例都具有唯一的OID。
第二级
缓存
是一个可插拔的的
缓存
插件,它是由SessionFactory负责管理。由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此第二级
缓存
是进程范围或者
集群
范围的
缓存
。这个
缓存
中存放的对象的松散数据。第二级对象有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被
缓存
的数据提供了
事务
隔离级别。缓存适配器用于把具体的
缓存
实现软件与Hibernate集成。第二级
缓存
是可选的,可以在每个类或每个集合的粒度上配置第二级
缓存
。
Hibernate的二级
缓存
策略的一般过程如下:
1) 条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL语句查询数据库,一次获得所有的数据对象。
2) 把获得的所有数据对象根据ID放入到第二级
缓存
中。
3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级
缓存
中查;查不到,如果配置了二级
缓存
,那么从二级
缓存
中查;查不到,再查询数据库,把结果按照ID放入到
缓存
。
4) 删除、更新、增加数据的时候,同时更新
缓存
。
Hibernate的二级
缓存
策略,是针对于ID查询的
缓存
策略,对于条件查询则毫无作用。为此,Hibernate提供了针对条件查询的Query缓存。
Hibernate的Query缓存策略的过程如下:
1) Hibernate首先根据这些信息组成一个Query Key,Query Key包括条件查询的请求一般信息:SQL, SQL需要的参数,记录范围(起始位置rowStart,最大记录个数maxRows),等。
2) Hibernate根据这个Query Key到Query缓存中查找对应的结果列表。如果存在,那么返回这个结果列表;如果不存在,查询数据库,获取结果列表,把整个结果列表根据Query Key放入到Query缓存中。
3) Query Key中的SQL涉及到一些表名,如果这些表的任何数据发生修改、删除、增加等操作,这些相关的Query Key都要从
缓存
中清空。
banq
发表文章: 11282
注册时间: 2002年08月03日
悄悄话
个人博客
当前离线
70人关注
Re: 【原创】Hibernate的缓存机制介绍
2006年03月02日 16:29
1
顶一下
Hibernate的二级
缓存
原理非常类似于Jdon框架(可见JF开发指南)。
虽然原理类似,但是区别在于:通过Jdon框架可灵活指定
缓存
位置,如
缓存
设置在持久层前面,这就象Hibernate缓存;但是也可以设置在更前面,如业务层前面,而且也可以实现持久层和业务层前的共用一个
缓存
,这些都以及在
JiveJdon
3中实现。
缓存提前访问的好处是:表现层的请求不必经过业务层直接得到
缓存
,节省业务层开销,缓存越靠近用户界面端,性能越好,查询越频繁使用,缓存击中率越高,各方面消耗就越小,最好
缓存
在客户端,这也是胖客户端一个性能优势。
banq
发表文章: 11282
注册时间: 2002年08月03日
悄悄话
个人博客
当前离线
70人关注
Re: 【原创】Hibernate的缓存机制介绍
2006年03月02日 16:34
1
顶一下
相关话题:
JF批量
缓存
讨论
http://www.jdon.com/jive/thread.jsp?forum=61&thread=25343
hibernate批量查询讨论
http://www.jdon.com/jive/thread.jsp?forum=61&thread=25343
banq
发表文章: 11282
注册时间: 2002年08月03日
悄悄话
个人博客
当前离线
70人关注
Re: 【原创】Hibernate的缓存机制介绍
2006年03月02日 17:06
顶一下
借这篇文章我稍微发表一下我关于
缓存
灵活设置的好处的看法:
将对象保存到
缓存
中必须在持久层实现,但是如果在业务层甚至表现层能够都能操作的
缓存
和持久层的
缓存
是同一个
缓存
好处就很大。
我们可以将业务状态保存到
缓存
中,我曾经发表一篇“状态对象:数据库的替代者”(http://www.jdon.com/artichect/state.htm),意思说尽量使用对象状态,少用数据库,就是把我们的数据保存到内存中,怎么保存到内存中呢?就是保存到
缓存
中。
如果保存到
缓存
中只能在持久层触发,显然不方便,想像一下我们有一个对象:如论坛状态,我不希望这个对象持久化保存到数据库,只要在内存中存在就可以了,如果
缓存
保存触发只在持久层,那就必须强迫我们保存到数据库中(可能Hibernate有这种只保存二级
缓存
,不保存到数据库功能,如发现提供一下),而单独直接操作
缓存
就可以做到这点。
所以,业务层特别是业务容器能够访问到
缓存
非常重要,这是Jdon框架的又一个特点,目前没有在Spring+Hibernate组合中看到如此精妙构思的功能。
banq
发表文章: 11282
注册时间: 2002年08月03日
悄悄话
个人博客
当前离线
70人关注
Re: 【原创】Hibernate的缓存机制介绍
2006年03月05日 11:59
顶一下
Jdon框架带来的业务层能够操作
缓存
或Session好处:
1. 自自由确定领域模型的scope, 所有业务逻辑可都在业务层实现,而不必将一些业务代码(如购物车)分离到表现层如struts的action中实现(因为其他框架只有在表现层中才能操作到Session,这是Spring 1.x本身没有的),减少代码在层选择上的痛苦和分散。
2. 对象状态(临时)只保存
缓存
中,而不保存到数据库,几乎对象都有自己的属性状态,状态频繁更新是日常应用系统特点,减少数据库持久操作,提高性能。Hibernate等数据库框架的
缓存
在这种情况下失效。
3.
缓存
越靠近客户端越快。
joney1026
发表文章:
注册时间: 2004年10月31日
悄悄话
个人博客
当前离线
Re: 【原创】Hibernate的缓存机制介绍
2006年03月06日 14:41
顶一下
这家伙就是能作广告
banq
发表文章: 11282
注册时间: 2002年08月03日
悄悄话
个人博客
当前离线
70人关注
Re: 【原创】Hibernate的缓存机制介绍
2006年03月28日 15:12
顶一下
相关话题:
如何使用Hibernate缓存,Open Session in View:
http://www.jdon.com/jive/thread.jsp?forum=62&thread=25314
jjd
发表文章: 2
注册时间: 2006年03月31日
悄悄话
个人博客
当前离线
Re: 【原创】Hibernate的缓存机制介绍
2006年03月31日 17:46
顶一下
我在自己的Blog里写了一篇<Hibernate的
缓存
机制介绍>
后来发现很多网站都引用了,并且都引自JDON,作者却成了lisign。
不知道为什么在文章前标识“原创”,但是在查看全文时却又指向我的Blog。
我的Blog
希望Jdon能及时更正。
motomagice
发表文章:
注册时间: 2006年07月09日
悄悄话
个人博客
当前离线
Re: 【原创】Hibernate的缓存机制介绍
2006年07月09日 17:53
顶一下
抄袭孙卫琴的书《Hibernate》里面的内容,一个字不查的打印了上来!
xyz
发表文章: 94
注册时间: 2005年08月22日
悄悄话
个人博客
当前离线
Re: 【原创】Hibernate的缓存机制介绍
2006年07月11日 14:34
顶一下
我说怎么看的这么眼熟,原来是抄袭!严重鄙视抄袭行为!
jiffy
发表文章:
注册时间: 2005年11月17日
悄悄话
个人博客
当前离线
Re: 【原创】Hibernate的缓存机制介绍
2006年12月04日 16:47
顶一下
孙卫琴的也是抄《hibernate in action》的,别把孙卫琴当神好不好
hibernate(147)
缓存cache(133)
数据库(187)
高性能(92)
共有
11
回复(
1
页)
Go
上一主题
返回本主题
返回主题列表
返回页首
下一主题
正在读取,请等待...
查询本论坛内
近一天
近三天
近一周
近一月
近三月
近半年
近一年
所有
回复超过
的热门帖子
标题
内容
提交时自动拷贝以上内容到剪贴板 Ctrl+V可取出;提问题前先查询
标签列表
使用帮助
解惑之道在
J道
,打造中国最具影响力的的软件架构社区
推荐FireFox或Chrome快速浏览本站
OpenSource
JIVEJDON
Powered by
JdonFramework
Code © 2002-10
jdon.com
anti spam