`
wu_quanyin
  • 浏览: 208258 次
  • 性别: Icon_minigender_1
  • 来自: 福建省
社区版块
存档分类
最新评论

Hibernate---缓存机制四(一,二级缓存的比较)

阅读更多

1.一级缓存和二级缓存的比较:
Hibernate中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存由hibernate管 理的,一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存。这一级别的缓存可以进行配 置和更改,并且可以动态加载和卸载。
 
 
第一级缓存
第二级缓存
存放数据的形式
相互关联的持久化对象
对象的散装数据
缓存的范围
事务范围,每个事务都有单独的第一级缓存
进程范围或集群范围,缓存被同一个进程或集群范围内的所有事务共享
并发访问策略
由于每个事务都拥有单独的第一级缓存,不会出现并发问题,无需提供并发访问策略
由于多个事务会同时访问第二级缓存中相同数据,因此必须提供适当的并发访问策略,来保证特定的事务隔离级别
数据过期策略
没有提供数据过期策略。处于一级缓存中的对象永远不会过期,除非应用程序显式清空缓存或者清除特定的对象
必须提供数据过期策略,如基于内存的缓存中的对象的最大数目,允许对象处于缓存中的最长时间,以及允许对象处于缓存中的最长空闲时间
物理存储介质
内存
内存和硬盘。对象的散装数据首先存放在基于内在的缓存中,当内存中对象的数目达到数据过期策略中指定上限时,就会把其余的对象写入基于硬盘的缓存中。
缓存的软件实现
在Hibernate的Session的实现中包含了缓存的实现
由第三方提供,Hibernate仅提供了缓存适配器(CacheProvider)。用于把特定的缓存插件集成到Hibernate中。
启用缓存的方式
只要应用程序通过Session接口来执行保存、更新、删除、加载和查询数据库数据的操作,Hibernate就会启用第一级缓存,把数据库中的数据以对 象的形式拷贝到缓存中,对于批量更新和批量删除操作,如果不希望启用第一级缓存,可以绕过Hibernate API,直接通过JDBC API来执行指操作。
用户可以在单个类或类的单个集合的粒度上配置第二级缓存。如果类的实例被经常读但很少被修改,就可以考虑使用第二级缓存。只有为某个类或集合配置了第二级 缓存,Hibernate在运行时才会把它的实例加入到第二 级缓存中。
用户管理缓存的方式
第一级缓存的物理介质为内存,由于内存容量有限,必须通过恰当的检索策略和检索方式来限制加载对象的数目。Session的evit()方法可以显式清空 缓存中特定对象,但这种方法不值得推荐。
第二级缓存的物理介质可以是内存和硬盘,因此第二级缓存可以存放大量 的数据,数据过期策略的maxElementsInMemory属性值可以控制内存中的对象数目。管理第二级缓存主要包括两个方面:选择需要使用第二级缓 存的持久类,设置合适的并发访问策略:选择缓存适配器,设置合适的数据过期策略。
分享到:
评论
2 楼 txw1013 2010-08-22  
<div class="quote_title">wu_quanyin 写道</div>
<div class="quote_div">
<p> </p>
<div style="text-indent: 21pt;"><span style="font-size: 14pt; line-height: 173%;">1.<strong>一级缓存和二级缓存的比较:</strong></span></div>
<div style="text-indent: 21pt;">Hibernate中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存由hibernate管理的,一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存。这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载。</div>
<div style="text-indent: 21pt;"> </div>
<table style="border: medium none; margin: auto auto auto 5.4pt; width: 414pt; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0" width="552"><tbody>
<tr>
<td style="padding: 0cm 5.4pt; width: 95.4pt; background-color: transparent;" width="127" valign="top"> </td>
<td style="padding: 0cm 5.4pt; width: 135pt; background-color: transparent;" width="180" valign="top">
<div><strong>第一级缓存</strong></div>
</td>
<td style="padding: 0cm 5.4pt; width: 183.6pt; background-color: transparent;" width="245" valign="top">
<div><strong>第二级缓存</strong></div>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 95.4pt; background-color: transparent;" width="127" valign="top">
<div><strong>存放数据的形式</strong></div>
</td>
<td style="padding: 0cm 5.4pt; width: 135pt; background-color: transparent;" width="180" valign="top">
<div>相互关联的持久化对象</div>
</td>
<td style="padding: 0cm 5.4pt; width: 183.6pt; background-color: transparent;" width="245" valign="top">
<div>对象的散装数据</div>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 95.4pt; background-color: transparent;" width="127" valign="top">
<div><strong>缓存的范围</strong></div>
</td>
<td style="padding: 0cm 5.4pt; width: 135pt; background-color: transparent;" width="180" valign="top">
<div>事务范围,每个事务都有单独的第一级缓存</div>
</td>
<td style="padding: 0cm 5.4pt; width: 183.6pt; background-color: transparent;" width="245" valign="top">
<div>进程范围或集群范围,缓存被同一个进程或集群范围内的所有事务共享</div>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 95.4pt; background-color: transparent;" width="127" valign="top">
<div><strong>并发访问策略</strong></div>
</td>
<td style="padding: 0cm 5.4pt; width: 135pt; background-color: transparent;" width="180" valign="top">
<div>由于每个事务都拥有单独的第一级缓存,不会出现并发问题,无需提供并发访问策略</div>
</td>
<td style="padding: 0cm 5.4pt; width: 183.6pt; background-color: transparent;" width="245" valign="top">
<div>由于多个事务会同时访问第二级缓存中相同数据,因此必须提供适当的并发访问策略,来保证特定的事务隔离级别</div>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 95.4pt; background-color: transparent;" width="127" valign="top">
<div><strong>数据过期策略</strong></div>
</td>
<td style="padding: 0cm 5.4pt; width: 135pt; background-color: transparent;" width="180" valign="top">
<div>没有提供数据过期策略。处于一级缓存中的对象永远不会过期,除非应用程序显式清空缓存或者清除特定的对象</div>
</td>
<td style="padding: 0cm 5.4pt; width: 183.6pt; background-color: transparent;" width="245" valign="top">
<div>必须提供数据过期策略,如基于内存的缓存中的对象的最大数目,允许对象处于缓存中的最长时间,以及允许对象处于缓存中的最长空闲时间</div>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 95.4pt; background-color: transparent;" width="127" valign="top">
<div><strong>物理存储介质</strong></div>
</td>
<td style="padding: 0cm 5.4pt; width: 135pt; background-color: transparent;" width="180" valign="top">
<div>内存</div>
</td>
<td style="padding: 0cm 5.4pt; width: 183.6pt; background-color: transparent;" width="245" valign="top">
<div>内存和硬盘。对象的散装数据首先存放在基于内在的缓存中,当内存中对象的数目达到数据过期策略中指定上限时,就会把其余的对象写入基于硬盘的缓存中。</div>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 95.4pt; background-color: transparent;" width="127" valign="top">
<div><strong>缓存的软件实现</strong></div>
</td>
<td style="padding: 0cm 5.4pt; width: 135pt; background-color: transparent;" width="180" valign="top">
<div>在Hibernate的Session的实现中包含了缓存的实现</div>
</td>
<td style="padding: 0cm 5.4pt; width: 183.6pt; background-color: transparent;" width="245" valign="top">
<div>由第三方提供,Hibernate仅提供了缓存适配器(CacheProvider)。用于把特定的缓存插件集成到Hibernate中。</div>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 95.4pt; background-color: transparent;" width="127" valign="top">
<div><strong>启用缓存的方式</strong></div>
</td>
<td style="padding: 0cm 5.4pt; width: 135pt; background-color: transparent;" width="180" valign="top">
<div>只要应用程序通过Session接口来执行保存、更新、删除、加载和查询数据库数据的操作,Hibernate就会启用第一级缓存,把数据库中的数据以对象的形式拷贝到缓存中,对于批量更新和批量删除操作,如果不希望启用第一级缓存,可以绕过Hibernate API,直接通过JDBC API来执行指操作。</div>
</td>
<td style="padding: 0cm 5.4pt; width: 183.6pt; background-color: transparent;" width="245" valign="top">
<div>用户可以在单个类或类的单个集合的粒度上配置第二级缓存。如果类的实例被经常读但很少被修改,就可以考虑使用第二级缓存。只有为某个类或集合配置了第二级缓存,Hibernate在运行时才会把它的实例加入到第二级缓存中。</div>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 95.4pt; background-color: transparent;" width="127" valign="top">
<div><strong>用户管理缓存的方式</strong></div>
</td>
<td style="padding: 0cm 5.4pt; width: 135pt; background-color: transparent;" width="180" valign="top">
<div>第一级缓存的物理介质为内存,由于内存容量有限,必须通过恰当的检索策略和检索方式来限制加载对象的数目。Session的evit()方法可以显式清空缓存中特定对象,但这种方法不值得推荐。</div>
</td>
<td style="padding: 0cm 5.4pt; width: 183.6pt; background-color: transparent;" width="245" valign="top">
<div>第二级缓存的物理介质可以是内存和硬盘,因此第二级缓存可以存放大量的数据,数据过期策略的maxElementsInMemory属性值可以控制内存中的对象数目。管理第二级缓存主要包括两个方面:选择需要使用第二级缓存的持久类,设置合适的并发访问策略:选择缓存适配器,设置合适的数据过期策略。</div>
</td>
</tr>
</tbody></table>
</div>
<p> </p>
1 楼 cmzx3444 2010-03-31  
hiberbate的二级缓存好像不怎么灵活,我想自己在二级缓存中存个对象,或自己修改二级缓存都不行,cacheManage对象好像拿不到,唉,害得我我只能在外层再套一层缓存

相关推荐

    项目中使用 hibernate-memcached 做二级缓存

    本文将详述如何在项目中使用Hibernate与Memcached结合实现二级缓存,并探讨Memcached的基本原理和使用方法。 首先,我们需要理解什么是Hibernate的二级缓存。在Hibernate框架中,一级缓存是每个Session级别的,它...

    day37 05-HIbernate二级缓存:一级缓存更新同步到二级缓存及二级缓存配置文件

    本篇文章将深入探讨Hibernate的二级缓存机制,以及如何进行一级缓存与二级缓存的同步,同时还会介绍二级缓存的配置文件设置。 一级缓存是Hibernate默认提供的缓存,每个SessionFactory实例都有一个一级缓存。当对象...

    hibernate一级缓存和二级缓存的区别与联系

    缓存机制分为一级缓存和二级缓存,两者都有助于减少对物理数据库的直接访问,从而提高应用程序的运行效率。 一级缓存是 Hibernate 内置的,默认开启,与 Session 对象关联。它是一个事务范围的缓存,也就是说,每个...

    hibernate一级和二级缓存配置与详解

    本篇将深入探讨Hibernate的一级缓存和二级缓存,以及查询缓存的配置和使用。 ### 一级缓存 一级缓存是Hibernate默认提供的缓存,它是Session级别的,每个Hibernate Session都有一个私有的、本地的一级缓存。当我们...

    hibernate-release-5.2.10

    6. **缓存**:Hibernate内置了二级缓存机制,可以通过配置使用如Ehcache这样的缓存提供者,提高性能。 7. **关联映射**:包括一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)、多对多(@...

    hibernate一级缓存、二级缓存和查询缓存

    **hibernate一级缓存、二级缓存和查询缓存** 在Java的持久化框架Hibernate中,缓存机制是提高应用程序性能的关键要素。缓存能够减少数据库的访问次数,提高数据读取速度,并且在一定程度上降低了系统的负载。本文将...

    hibernate-core 核心jar包

    第二层是可选的,可以配置为使用第三方缓存服务,如Ehcache,称为二级缓存。缓存可以显著提升数据访问速度。 10. **事件和监听器**:Hibernate允许注册事件监听器,对特定的持久化操作(如加载、保存、更新、删除)...

    Hibernate一级缓存和二级缓存

    标题“Hibernate一级缓存和二级缓存”指的是Hibernate框架中的两种缓存机制,它们是提高数据访问性能的关键要素。一级缓存是Session级别的,而二级缓存是SessionFactory级别的,两者在数据库操作中起到了重要的作用...

    hibernate-jpa-2.1-api-1.0.0.final.jar.zip

    - **缓存**: Hibernate的二级缓存可以显著提升性能,通过配置可以缓存查询结果和实体实例。 - **批处理**: 使用批处理更新和插入,可以减少数据库交互次数,提高效率。 - **连接池**: 配置合适的连接池,如...

    hibernate-core-5.0.11.Final.jar

    - 使用二级缓存提高性能,如EhCache集成。 - 合理设计实体关系,避免N+1查询问题。 - 使用批处理更新和插入,减少数据库交互次数。 通过以上分析,我们可以看出`hibernate-core-5.0.11.Final.jar`在ORM中的重要地位...

    Hibernate一级缓存、二级缓存以及查询缓存实例

    本文将深入探讨Hibernate的一级缓存、二级缓存以及查询缓存,通过具体的实例来阐述它们的工作原理和使用方法。 首先,我们从一级缓存开始。一级缓存是Hibernate默认提供的缓存,它是每个Session级别的,也被称为...

    hibernate-memcached-1.1.0-sources.zip

    `hibernate-memcached-1.1.0-sources.zip`提供的源码实现了一个Hibernate二级缓存提供者,它将Hibernate的查询结果缓存在Memcached中,当再次进行相同查询时,可以直接从缓存中获取数据,避免了重复的数据库查询。...

    Hibernate-annotations-3.4最新版本

    @Transactional注解可以标记一个方法为事务边界,而Hibernate的二级缓存通过@Cacheable和@Cache配置,可以提高查询性能,降低数据库压力。 除此之外,Hibernate-annotations还支持了实体的懒加载和级联操作。例如,...

    hibernate-release-5.0.0.Final(1).zip

    - 利用缓存机制提高数据访问速度,如一级缓存(Session级)和二级缓存(SessionFactory级)。 五、最佳实践 1. 合理设计实体类:遵循单一职责原则,避免实体类过于庞大,提高代码可维护性。 2. 选择合适的映射策略...

    hibernate-release-5.0.7.Final.zip

    - 缓存优化:包括二级缓存的性能提升和对查询结果的缓存支持。 4. 传智播客黑马程序员2016版框架 在传智播客黑马程序员2016年的Hibernate课程中,讲师深入讲解了如何使用5.0.7.Final版本进行实际项目开发,包括...

    hibernate-orm-master.zip

    3. **缓存策略**:Hibernate提供了第一级缓存(Session级别的)和第二级缓存(SessionFactory级别的)。第一级缓存默认开启,提高性能;第二级缓存可选,可以跨会话共享,但需要额外配置。 4. **查询语言**:...

    hibernate二级缓存java包下载

    二级缓存是 Hibernate 缓存策略的一部分,它在应用程序的多个会话之间共享数据,进一步优化了数据库访问效率。 二级缓存分为以下关键知识点: 1. **一级缓存与二级缓存的区别**: - 一级缓存:每个 Hibernate ...

    hibernate-release-4.2.4.Final.zip

    10. **缓存机制**:Hibernate提供了第一级缓存(Session级别的)和第二级缓存(SessionFactory级别的)以提高性能,减少对数据库的直接访问。此外,还可以集成第三方缓存服务如EHCache。 总之,Hibernate 4.2.4....

    hibernate的一级缓存和二级缓存

    《深入理解Hibernate的一级缓存与二级缓存》 Hibernate作为一款强大的ORM框架,其缓存机制是优化数据库操作性能的关键之一。缓存主要分为一级缓存和二级缓存,它们各自承担着不同的职责,共同提升了数据访问的效率...

Global site tag (gtag.js) - Google Analytics