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

hibernat一级缓存和二级缓存

阅读更多
见网址:http://www.cnblogs.com/RicCC/archive/2007/04/17/NHibernate-Entity-LifeCycle-Secondary-Cache-Interceptor.html
Session级别缓存(一级缓存)、SessionFactory级别缓存(二级缓存)
    一级缓存处于session级别,只能够被当前的session使用,当你的session关闭之后,这些缓存被清除掉。你对一级缓存不能进行多少控制,例如最大缓存多少个对象等。二级缓存在SessionFactory级别,这意味着从这个SessionFactory创建的所有session对象能共享这个缓存。二级缓存允许更多的控制,例如设定一个最大缓存的对象数量,以防止缓存使用过多的内存;针对每个实体可以配置缓存策略。
    NHibernate提供很多方式操纵实体和数据库,这给缓存与数据库之间的一致性带来问题,你需要了解这些问题,在程序面避免这种一致性问题发生,或者保证它是在你的控制之内。举一个例子,假如你通过session.Get()方法获取了一个对象,这时在二级缓存中该对象被缓存,然后在另外的地方有人使用Native SQL在数据库中把这条记录删除了。这种情况下,二级缓存中该对象仍然是有效的,别人在使用session.Get()获取这个对象时 NHibernate会返回二级缓存中的对象,但是在数据库中这个对象已经不存在了!

    另外是关于批量操作的问题。
    首先是批量插入、更新。一级缓存没有最大容量限制,所有persistent状态的对象都被缓存在一级缓存中,修改更新被记录下来,只在commit transaction的时候,才将更新提交数据库,在session关闭的时候清除一级缓存。假如你一次批量插入、更新10万、100万的对象,过大的缓存会导致大量的内存占用、低下的性能表现。可以使用下面的措施做一些改善:例如每500个对象执行一次应用到数据库和清除缓存的操作:
session.Flush();   //将缓存中的变化应用到数据库
session.Clear();   //清除当前session的缓存
    使用batch-size使NHibernate一次提交多个SQL语句,在性能上会有一定的改善。方法是在批量操作的对象映射配置中将batch-size设置为50、100等。
    其次是关于批量删除操作。如果你使用
int deletedRows = session.Delete("from PlantItem");
    NHibernate用下面的方式实现
IList<PlantItem> list = session.CreateQuery("from PlantItem").List<PlantItem>();
for (int i = 0; i < list.Count; i++)
{
    session.Delete(list[i]);
}
    这是因为NHibernate需要保证缓存跟数据库的一致性,上面这样的处理是跟缓存机制结合在一起的,保证了一致性(目前HB只能通过这种方式来保证),但却带来性能的损失。
    假如你一次delete的数据有几百万,就不能这样来实现。一种方式,类似上面批量插入、更新的优化手段一样来处理,你需要进一步改善一些,例如每次用 session加载1000、5000的对象(避免一次读个几百万),循环的处理。另一种方式就是使用Native SQL等,优点是速度快,但跨过了NHB的缓存机制,会导致缓存不一致。
    可以使用SessionFactory的几个方法手工清除二级缓存,可以清除某个对象实例、整个类的二级缓存对象,也可以清除collection、query的二级缓存。例如:
sessionFactory.Evict(typeof(PlantItem));  //清除二级缓存中所有PlantItem对象

    启用二级缓存的方法。首先在NHibernate的configuration里面添加缓存配置属性
<property name="cache.provider_class">
      NHibernate.Caches.Prevalence.PrevalenceCacheProvider, NHibernate.Caches.Prevalence
</property>
<property name="cache.use_query_cache">false</property>
<property name="expiration">120</property>
    然后为每个实体类选择缓存策略
<class name="PlantItem" table="TBLPLANTITEM" batch-size="10">
  <cache usage="read-write" />
    Cache provider和缓存策略参考文档进行选择。use_query_cache选项谨慎使用。
    use_query_cache启用方法:在配置节点中将cache.use_query_cache配置为true,程序代码中,使用IQuery、 ICriteria的地方调用IQuery.SetCacheable(true)或者ICriteria.SetCacheable(true),则对这些查询会启用缓存。
    如果使用NHibernate.Caches.Prevalence,可以在NHibernate的configuration里面添加一个配置项,用于设置Bamboo.Prevalence的缓存目录,如果不设置缓存目录,默认是当前应用程序目录。配置示例如下:
<property name="prevalenceBase">
      D:\Work\CMSDesign\PreTest\CMS\Web\CacheFolder
</property>
     看了下NHibernate.Caches.Prevalence源代码,请特别注意一点,NHibernate在停止NHibernate.Caches.Prevalence缓存的时候,会把这个缓存目录删除掉,因此使用NHibernate.Caches.Prevalence作为缓存时,一定要妥善的设置好缓存目录!另外,如果你用VS2005建立的是Web Site Project(Web Application Project的情况我不大清楚),调试时使用的是WebDev.WebServer.exe,在Stop的时候并不会触发 Application_End事件,因此你没有机会执行ISessionFactory.Close(),NHibernate.Caches.Prevalence的缓存目录不会被清除掉,因此下一次再执行调试而启用缓存的时候,会导致异常。有两个解决方法,一是每次手工删除缓存目录,另外一种是写一个类似exit.aspx页面,在每次退出时手工执行一次ISessionFactory.Close(),这样就会将缓存清除。

    如果使用NHibernate.Caches.SysCache,就可以象ASP.Net一样配置缓存策略,例如缓存过期时间等。还可以建立不同的 Region,使用不同的缓存策略,然后在Class映射文件的<cache usage="" region="" />中通过指定region,而使用不同的缓存策略配置。
<configuration>
    <configSections>
        <section name="syscache"
                type="NHibernate.Caches.SysCache.SysCacheSectionHandler,NHibernate.Caches.SysCache" />
    </configSections>
    <syscache>
        <cache region="foo" expiration="500" priority="4" />
        <cache region="bar" expiration="300" priority="3" />
    </syscache>
</configuration>
分享到:
评论

相关推荐

    Hibernate一级缓存和二级缓存

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

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

    总结来说,Hibernate 的一级缓存和二级缓存都是为了提高数据访问效率,但它们在范围和并发控制方面有所不同。一级缓存是事务级别的,保证了数据的强一致性,而二级缓存提供了更多的灵活性,可以跨事务共享,但需要...

    Hibernate 一级缓存和二级缓存的区别

    Hibernate 一级缓存和二级缓存的区别

    hibernate一级缓存和二级缓存的区别

    用以介绍hibernate 框架的缓存机制

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

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

    Hibernate一级缓存和二级缓存【内附二级缓存数据存储结构】

    本文将深入探讨Hibernate的一级缓存和二级缓存,以及二级缓存的数据存储结构。 首先,一级缓存是Hibernate默认提供的缓存,每个Session都有一个独立的一级缓存。当我们在操作数据库时,例如查询或更新记录,这些...

    Hibernate一级缓存和二级缓存详解

    Hibernate一级缓存和二级缓存详解 Hibernate是一种流行的基于Java的持久化框架,它提供了两种缓存机制:一级缓存和二级缓存。了解这两种缓存机制是非常重要的,因为它们可以极大地提高应用程序的性能。 一级缓存 ...

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

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

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

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

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

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

    hibernate的一级缓存和二级缓存

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

    hibernate二级缓存实例

    总的来说,"hibernate二级缓存实例"是一个很好的学习资源,它可以帮助我们理解二级缓存的工作机制,掌握如何在项目中配置和使用,以及注意潜在的问题和优化策略。通过实践,我们可以更好地运用这一技术,提升Java...

    Hibernate二级缓存

    Hibernate二级缓存是一种提高应用程序性能的技术,它将数据存储在SessionFactory级别的缓存中,使得数据可以在不同的Session之间共享。这与一级缓存(Session级别)不同,一级缓存仅存在于单个Session生命周期内,当...

    hibernate 二级缓存详解

    Hibernate 二级缓存是针对SessionFactory级别的全局缓存,与一级缓存(Session级别)不同,一级缓存只在单个Session生命周期内有效。二级缓存则允许不同Session之间共享数据,提高了数据访问效率,减少了对数据库的...

    hibernate二级缓存示例源码

    综上所述,通过学习`hibernate二级缓存示例源码`,我们可以了解到如何在实际项目中配置和使用Hibernate二级缓存,从而提升系统的性能。在实际应用中,应结合具体场景选择合适的缓存策略,以达到最佳的性能优化效果。

    hibernate二级缓存

    在Hibernate框架中,缓存分为一级缓存和二级缓存。 一级缓存是默认开启的,它与Session对象关联,主要负责在同一个事务内部管理对象的状态。一级缓存会跟踪所有在事务中被修改的对象,确保在事务提交时仅生成必要的...

    hibernate二级缓存包

    Hibernate二级缓存是Java开发中使用Hibernate框架进行数据持久化时优化性能的一种重要技术。它在一级缓存(Session级别的缓存)的基础上,提供了一个全局的、跨会话的数据存储层,可以显著减少对数据库的访问,从而...

    Hibernate 二级缓存

    Hibernate 二级缓存

    Hibernate 二级缓存 总结整理

    在处理大数据量或高并发的场景下,为了提高性能和减少数据库负载,Hibernate 提供了二级缓存机制。本文将深入探讨Hibernate的二级缓存,并结合相关源码进行解析。 ### 一、一级缓存与二级缓存 1. **一级缓存...

    hibernate二级缓存java包下载

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

Global site tag (gtag.js) - Google Analytics