hibernate之高速缓存基本原理(高速缓存策略和范围)

本文探讨了Hibernate中高速缓存的基本原理,包括不同类型的高速缓存及其应用场景。介绍了事务范围、过程范围及集群范围高速缓存的特点,并讨论了它们与对象同一性之间的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hibernate之高速缓存基本原理(高速缓存策略和范围)

我们之所以认为使用对象/关系持久层远胜于用直接的JDBC创建的应用程序,一个重要的理由在于:高速缓存的潜能。高速缓存就是性能优化,高速缓存使当前数据库状态的表示接近应用程序,要么在内存中,要么在应用程序服务器机器的磁盘上。高速缓存是数据的一个本地副本,处在应用程序和数据库之间,可以用来避免数据库命中,每当:
. 应用程序通过标识符(主键)执行查找的时候。
. 持久层延迟解析一个关联或者集合的时候。
高速缓存策略和范围
高速缓存的概念在对象/关系持久化中是如此基本,以致如果你不先知道它使用了哪种高速缓存策略,就无法理解性能、可伸缩性或者ORM实现的事务语义。有3种主要的高速缓存类型:
. 事务范围高速缓存---添加到当前的工作单元,它可能是一个数据库事务,甚至是一个对话。它只有在工作单元运行时才是有效的,才能被使用。每一个工作单元都有自己的高速缓存。这个高速缓存中的数据不会被并发访问。
. 过程范围高速缓存---在许多(可能并发的)工作单元或者事务之间共享。这意味着过程范围高速缓存中的数据被并发运行的线程访问,显然隐含着事务隔离性。
. 集群范围高速缓存---在同一台机器的多个过程之间或者一个集群中的多台机器上共享。这里,网络通信是一个值得考虑的关键点。
----------
1.高速缓存和对象同一性
考虑事务范围的高速缓存。这个高速缓存似乎很自然地也被用作对象的同一性范围。这意味着高速缓存实现同一性处理:对于使用相同数据库标识符的对象的两个查找返回了实际上相同的Java实例。因此,如果持久化机制也提供工作单元范围的对象同一性,事务范围高速缓存就是理想的。
利用过程范围高速缓存的持久化机制可能选择实现过程范围的同一性。在这种情况下,对象同一性就相当于整个过程的数据库同一性。在两个并发运行的工作单元中,使用相同的数据库标识符的两个查找产生了相同的Java实例。另一种方法是,从过程范围的高速缓存中获取的对象可能按值被返回。此时,每个工作单元获取它的状态副本,并且生成的持久化实例也不相同。高速缓存的范围和对象同一性的范围就不再相同。
集群范围高速缓存始终需要远程通信,并且在面向POJO的持久化解决方案(如hibernate)的案例中,对象始终按值被远程传递。因此,集群范围高速缓存无法保证跨越集群的同一性。
对于典型的web或者企业应用程序的架构来说,对象同一性的范围被限制为单个工作单元最方便。换句话说,在两个并发的线程中有相同的对象既不必要也不理想。
----------
2.高速缓存和并发
如果你也使用工作单元范围的对象同一性,并且如果对于高并发的多用户系统来说它是最佳策略,那么事务/工作单元范围的高速缓存就是首选。这个一级高速缓存是强制的,因为它也保证同一的对象。然而,这并非是你可以使用的唯一高速缓存。对于有些数据,二级高速缓存被界定到按值返回数据的过程(或者集群)中可能会有好处。因此这个场景有两个高速缓存层;
----------
3.二级高速缓存备选类是表示以下数据的类:
. 很少改变的数据。
. 不重要的数据(如内容管理数据)。
. 应用程序固有的而非共享的数据。
对于二级高速缓存来说,不好的备选类是:
. 经常被更新的数据。
. 财务数据。
. 通过遗留应用程序共享的数据。
通常应用的规则不是唯一的。许多应用程序都有大量包含下列属性的类:
. 少量的实例。
. 被另一个类或者几个类的许多实例引用的每一个实例。
. 很少(或者从不)更新的实例。
这种数据有时称引用数据。引用数据的例子是邮政编码、参考地址、办公地点、静态文本消息等。引用数据对于利用过程或者集群范围的高速缓存而言是级好的备选对象,并且如果这个数据被高速缓存,任何大量使用引用数据的应用
程序都将受益匪浅。你允许数据在高速缓存超时到期时刷新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值