转自http://developer.51cto.com/art/200909/153359.htm
--- blogjava
本文主要介绍Hibernate缓存,以及Hibernate缓存的分类,下面一一为读者简单分析,希望大家看后有很大的收获。
1、Hibernate缓存概述
缓存是介于物理数据源与应用程序之间,是数据库数据在内存中的存放临时copy的容器,其作用是为了减少应用程序对物理数据源访问的次数,从而提高了应用的运行性能。Hibernate在进行读取数据的时候,根据缓存机制在相应的缓存中查询,如果在缓存中找到了需要的数据(我们把这称做“缓存命中"),则就直接把命中的数据作为结果加以利用,避免了建立数据库查询的性能损耗。
2:Hibernate缓存分类
一级缓存(session):内部缓存
事务范围:缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期,当事务结束时,缓存也就结束生命周期。
二级缓存(sessionFactory):缓存被应用范围内的所有事务共享。 这些事务有可能是并发访问缓存,因此必须对缓存进行更新。缓存的生命周期依赖于应用的生命周期,应用结束时, 缓存也就结束了生命周期,二级缓存存在于应用范围。集群范围:在集群环境中,缓存被一个机器或者多个机器的进程共享。缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓存中的数据的一致性, 缓存中的数据通常采用对象的松散数据形式,二级缓存也存在与应用范围。
注意:对大多数应用来说,应该慎重地考虑是否需要使用集群范围的缓存,再加上集群范围还有数据同步的问题,所以应当慎用。多种范围的缓存处理过程持久化层可以提供多种范围的缓存。如果在事务范围的缓存中没有查到相应的数据,还可以到应用范围或集群范围的缓存内查询,如果还是没有查到,那么只有到数据库中查询了。
缓存应用的范围:修改少,数量在可以接受的范围内
使用二级缓存的原则:
◆数据不会被第三方修改
◆同一数据系统经常引用
◆数据大小在可接受范围之内
◆关键数据或不会被并发更新的数据
hibernate引入第三方的缓存组件EHCACHE,下面是具体的实现步骤:
修改hibernate.cfg.xml配置引入ehCache缓存
<hibernate-configuration> <session-factory> <property name="hibernate.cache.provider_class"> net.sf.ehcache.hibernate.EhCacheProvider property> <property name="hibernate.cache.use_query_cache">trueproperty> session-factory> hibernate-configuration> 在src根目录下加入ehcache.xml文件,具体内容如下:
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd"> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" /> ehcache> 在映射文件中指定缓存同步策略
<class name="com.tenly.bean.Student"> <cache usage="read-write"> <set name="classroom"> <cache usage="read-only"> set> class> usage属性说明:
◆read-only:只读。对于不会发生改变的数据,可使用只读型缓存。
◆nonstrict-read-write:不严格可读写缓存。如果应用程序对并发访问下的数据同步要求不是很严格的话,而且数据更新操作频率较低。采用本项,可获得良好的性能。
◆read-write 对于经常被读但很少修改的数据,可以采用这种隔离类型,因为它可以防止脏读这类的并发问题.
◆transactional(事物型)在Hibernate中,事务型缓存必须运行在JTA事务环境中。在测试query时,说明其将用二级缓存
query.setCacheable(true); 3、释放缓存:
一级缓存的释放
Session.evict(XXX) 将某个特定的对象从内部缓存中清除,上述的XXX 为对象的实例名。使用此方法有两种适用情形,需要及时释放对象占用的内存维持系统的稳定性是不希望当前Session继续运用此对象的状态变化来同步更新数据库。Session.clear()清除所有的一级缓存
二级缓存的释放
SessionFacatoyr.evict(XXX) 将某个特定的对象从内部缓存中清除,上述的XXX 为对象的实例名。使用此方法有两种适用情形,需要及时释放对象占用的内存维持系统的稳定性是不希望当前Session继续运用此对象的状态变化来同步更新数据库。SessionFactory.clear()清除所有的二级缓存
4、查询缓存:
二级缓存策略的一般过程:
Hibernate进行条件查询的时候,总是发出一条select * from XXX where …(XXX为 表名,类似的语句下文统称Select SQL)这样的SQL语句查询数据库,一次获得所有的符合条件的数据对象。把获得的所有数据对象根据ID放入到第二级缓存中。当Hibernate根据ID访问数据对象的时候,首先从内部缓存中查找,如果在内部缓存中查不到就配置二级缓存,从二级缓存中查;如果还查不到,再查询数据库,把结果按照ID放入到缓存。添加数据、删除、更新操作时,同时更新二级缓存。这就是Hibernate做批处理的时候效率不高的原因,原来是要维护二级缓存消耗大量时间的缘故。
条件查询的处理过程:
第一次查找age>20的所有学生信息,然后纳入二级缓存。第二次我们的查询条件变了,查找age>15的所有学生信息,显然第一次查询的结果完全满足第二次查询的条件,但并不是满足条件的全部数据。这样的话,我们就要再做一次查询得到全部数据才行。如果我们执行的是相同的条件语句,Hibernate引入Query Cache的。
查询缓存策略的一般过程:
完全相同的Select SQL重复执行。重复执行期间,Query Key对应的数据表不能有数据变动(比如添、删、改操作)
启用Query Cache,我们需要在hibernate.cfg.xml中进行配置,参考配置如下(只列出核心配置项):
<hibernate-configuration> <session-factory> <property name="hibernate.cache.user_query_cache">trueproperty> session-factory> hibernate-configuration> 在查询执行之前,将Query.Cacheable设置为true,而且每次都应该这样。比如:
Query query=session.createQuery(hql).setInteger(0.15); query.setCacheable(true); 【编辑推荐】
分享到:
相关推荐
标题“Hibernate一级缓存和二级缓存”指的是Hibernate框架中的两种缓存机制,它们是提高数据访问性能的关键要素。一级缓存是Session级别的,而二级缓存是SessionFactory级别的,两者在数据库操作中起到了重要的作用...
二级缓存通常由第三方插件如Ehcache、Infinispan等提供,这些插件实现了JCache(JSR-107)标准,与Hibernate无缝集成。 ### 3. 二级缓存配置 在Hibernate配置文件(hibernate.cfg.xml)中,我们需要添加二级缓存...
### 一、一级缓存与二级缓存 1. **一级缓存(First-Level Cache)**:每个Session实例都有一个私有的、线程安全的一级缓存,它是默认开启且不可关闭的。当我们在Session中对实体进行CRUD操作时,数据会首先被缓存到...
3. **Hibernate与memcached集成**:将memcached作为Hibernate二级缓存的提供者,需要配置相应的插件或库,如hibernate-ehcache或hibernate-memcached。集成过程通常包括配置Hibernate的配置文件(hibernate.cfg.xml...
3. 分布式缓存:在多节点环境中,可以考虑使用二级缓存(如 Ehcache 或 Infinispan)来实现跨节点的数据共享,提高系统性能。 总结: 一级缓存作为 Hibernate 的核心特性,极大地提高了数据访问效率。通过对源码的...
1. **Hibernate二级缓存**:在默认情况下,Hibernate只使用一级缓存(Session级别的缓存),二级缓存则可由用户自定义配置。二级缓存是多个Session共享的,可以跨事务存储对象,提高了数据读取速度,减少了对数据库...
`Hibernate二级缓存攻略.doc`可能是整个工程的指南,包括如何导入工程,运行测试用例,以及对一级缓存和二级缓存的观察分析。 项目中的`hb1101`可能是一个特定的配置文件或代码模块,用于演示如何在实际应用中设置...
同时,理解一级缓存的原理也有助于我们理解二级缓存和其他缓存解决方案,如Ehcache和Infinispan,以及它们在复杂分布式系统中的应用。 总之,Hibernate的一级缓存是提高应用程序性能的关键因素之一。理解其工作原理...
Ehcache是Hibernate的一个可选二级缓存插件,用于存储数据库查询结果,减少对数据库的直接访问。当相同的数据再次被请求时,可以从缓存中快速获取,提高系统响应速度。在不使用缓存的情况下,可以通过配置关闭。 5...
1. 添加二级缓存库,如本例中的`ehcache-core-2.4.3.jar`,这是Hibernate常用的一种二级缓存实现。 2. 在`pom.xml`或`build.gradle`中引入依赖。 3. 配置`hibernate.cfg.xml`,指定使用二级缓存插件,并设置缓存策略...
例如,一级缓存的生命周期与`Session`相同,而二级缓存可以在整个应用期间持续存在。 4. **缓存的命中率**:通过优化缓存策略,提高缓存的命中率,从而提高整体系统的性能。 #### 总结 通过深入了解Hibernate缓存...
总结,Hibernate缓存机制是提升系统性能的重要手段,通过一级缓存减少数据库交互,二级缓存提供跨Session的数据共享,查询缓存则进一步优化了重复查询的效率。理解和充分利用这些缓存策略,能有效优化基于Hibernate...
3. Infinispan:一款强大的内存数据网格,也可以作为Hibernate的二级缓存,支持集群和分布式缓存。 四、配置与使用 在实际项目中,我们需要在Hibernate配置文件(如hibernate.cfg.xml)中启用二级缓存,并选择合适...
总的来说,这个教程应该涵盖了Hibernate缓存的基础知识,包括一级缓存的工作方式、二级缓存的配置和使用、查询缓存的优缺点,以及如何在S2SH项目中实践这些概念。通过理解和实践这些内容,开发者能够更好地优化其...
4. **清除缓存**:在必要的时候,可以显式地调用`Session.clear()`方法清除一级缓存,或者使用`SessionFactory.evict()`方法清除二级缓存中的特定实体,以确保下一次操作时能获取到最新的数据。 5. **配置缓存模式*...
二级缓存是SessionFactory级别的,可跨会话共享数据。通过配置`hibernate.cache.region.factory_class`和`hibernate.cache.use_second_level_cache`启用,可以显著提升系统性能,但需要注意并发和数据一致性问题。 ...
为了提高性能,Hibernate支持二级缓存和查询缓存。二级缓存可以存储已加载的实体,减少对数据库的访问;查询缓存则缓存查询结果,避免重复计算。通过源码,我们可以了解CacheProvider、Region和QueryKey等概念,以及...
本文将详细解析Hibernate的一级缓存和二级缓存。 **一级缓存** 一级缓存是SessionFactory创建的Session对象所绑定的本地缓存。其生命周期与Session相同,当Session关闭时,一级缓存也会随之销毁。一级缓存是实体...
2. Hibernate缓存机制.doc:这个文档应该详细解释了Hibernate的一级和二级缓存机制,包括缓存的生命周期、更新策略(如脏检查和锁机制)以及缓存失效策略。 3. osCache.doc:可能深入介绍了Oscache的高级特性和最佳...