1.声明:该文章转帖于:http://www.iteye.com/topic/18904
2.Class的缓存
对于一条记录,也就是一个PO(Persient Object)来说,是根据ID来查找的,缓存的Key就是ID,value就是POJO。无论list,load还是iterate,只要读出一个对象,都会填充缓存。但是list不会使用缓存,而iterate会先取数据库的select id出来,然后一个id一个id地load,如果在缓存里面有,就从缓存取,没有的话就去数据库load。假设是读写,则需要设置:
<cache usage="read-write"/>(这是是在*.hmb.xml中设置,位于id属性之前,class属性之后)
同时需要ehcache.xml(放置到classpath目录下)
<cache name="com.skywin.simpass.db.domain.PartnerInfo"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="360"
overflowToDisk="false" />
其中:
eternal表示的是:缓存是不是永远不过期。(关于过期时间的判断是由 org.hibernate.cache.UpdateTimestampsCache时间戳决定的)
timeToLiveSeconds表示的是:缓存中每个元素(这里也就是一个POJO)的超时时间,如果eternal设定是false的话,超过指定的时间,这个元素就被移走。
timeToIdleSeconds指的是:空闲时间(暂时没有搞定这个东西)
每个需要缓存的class都要这样配置。如果没有配置,hibernate会在启动时警告你,然后使用defaultCache的配置,这样多个class会共享一个配置。
(关于Hibernate的ehcach.xml二级缓存配置,详见附件)
当某个ID通过Hibernate修改时,Hibernate会知道,于是先移除缓存。
3.查询缓存
首先要配置:hibernate.cache.use_query_cache=true(在hibernate.cfg.xml或者spring的applicationContext.xml的bean id="sessionFactory"中为其声明)。
其次配置StandardQueryCache
<cache name="org.hibernate.cache.StandardQueryCache"
maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120"
timeToLiveSeconds="360" overflowToDisk="false" />
然后使用Query接口的setCacheable(true);//激活查询缓存
query.setCacheRegion("myCacheRegion"); //指定要使用的cacheRegion,options
( 哈哈,一般我都不习惯使用这个东西)
<cache name="myCacheRegion"
maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120"
timeToLiveSeconds="360" overflowToDisk="false" />
对于查询缓存来说,缓存Key是根据hql生成的sql,再加上参数,分页等信息。
比如hql:
from Cat c where c.name like ? (Query接口默认的是select 操作)
生成的sql语句大致如下:
select * from cat c where c.name like ?
参数是"tiger%",那么查询缓存的key大致会组装成这样子的:
select * from cat c where c.name like ?, parameter: tiger%
这样,保证了同样的查询,同样的参数等条件下具有一样的key。
现在说说缓存的value,如果是list方式的话,Value在这里并不是整个结果集,而是查询出来的这一串ID。也就是说,不管是list方法还是iterate方法,第一次查询的时候,它们的查询方式和它们平时的方式是一样的,list执行一条sql,iterate执行1+N条,多出来的行为是它们填充了缓存。
当hibernate更新数据库的时候,它怎么知道更新哪些查询缓存呢?
hibernate在一个地方维护每个表的最后更新时间,其实也就是放在上面org.hibernate.cache.UpdateTimestampsCache(Hibernate 2.0版本是net.sf)所指定的缓存配置里面。
当通过hibernate更新的时候,hibernate会知道这次更新影响了哪些表。然后它更新这些表的最后更新时间。每个缓存都有一个生成时
间和这个缓存所查询的表,当hibernate查询一个缓存是否存在的时候,如果缓存存在,它还要取出缓存的生成时间和这个缓存所查询的表,然后去查找这
些表的最后更新时间,如果有一个表在生成时间后更新过了,那么这个缓存是无效的。
可以看出,只要更新过一个表,那么凡是涉及到这个表的查询缓存就失效了,因此查询缓存的命中率可能会比较低。
4.Collection缓存
需要在*.hbm.xml的collection(set/bag/...)里面设置
<cache usage="read-write"/>
同时,需要在ehcache.xml中增加
<cache name="...Cat.children"
.../>
Collection的缓存和前面查询缓存的list一样,也是只保持一串id,但是它不会因为这个表更新过就失效,一个collection缓存仅在这个collection里面的元素有增删时才失效。
分享到:
相关推荐
Hibernate二级缓存是一种持久化层缓存机制,用于提高数据访问效率。一级缓存是由Hibernate的Session提供的,它是一个事务性的缓存,每个Session都有自己的独立缓存,同一个ID的对象在同一个Session内多次加载只会...
在这个"hibernate二级缓存实例"中,我们将深入探讨二级缓存的原理、配置以及在实际项目中的应用。 首先,我们需要了解一级缓存和二级缓存的区别。一级缓存是Session级别的,每个Session都有自己的一级缓存,用于...
总结来说,Hibernate 的一级缓存和二级缓存都是为了提高数据访问效率,但它们在范围和并发控制方面有所不同。一级缓存是事务级别的,保证了数据的强一致性,而二级缓存提供了更多的灵活性,可以跨事务共享,但需要...
Hibernate二级缓存是一种提高应用程序性能的技术,它将数据存储在SessionFactory级别的缓存中,使得数据可以在不同的Session之间共享。这与一级缓存(Session级别)不同,一级缓存仅存在于单个Session生命周期内,当...
**hibernate二级缓存详解** Hibernate作为Java领域中广泛使用的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,在处理大量数据时,性能优化显得尤为重要,这就是二级缓存的作用。本文将深入探讨Hibernate...
Hibernate 二级缓存是针对SessionFactory级别的全局缓存,与一级缓存(Session级别)不同,一级缓存只在单个Session生命周期内有效。二级缓存则允许不同Session之间共享数据,提高了数据访问效率,减少了对数据库的...
`Hibernate二级缓存攻略.doc`可能是整个工程的指南,包括如何导入工程,运行测试用例,以及对一级缓存和二级缓存的观察分析。 项目中的`hb1101`可能是一个特定的配置文件或代码模块,用于演示如何在实际应用中设置...
**hibernate一级缓存、二级缓存和查询缓存** 在Java的持久化框架Hibernate中,缓存机制是提高应用程序性能的关键要素。缓存能够减少数据库的访问次数,提高数据读取速度,并且在一定程度上降低了系统的负载。本文将...
Hibernate二级缓存是Java开发中使用Hibernate框架进行数据持久化时优化性能的一种重要技术。它在一级缓存(Session级别的缓存)的基础上,提供了一个全局的、跨会话的数据存储层,可以显著减少对数据库的访问,从而...
本篇文章将深入探讨Hibernate的二级缓存机制,以及如何进行一级缓存与二级缓存的同步,同时还会介绍二级缓存的配置文件设置。 一级缓存是Hibernate默认提供的缓存,每个SessionFactory实例都有一个一级缓存。当对象...
Hibernate 二级缓存
**二、Hibernate二级缓存** 二级缓存是SessionFactory级别的,跨越了多个Session,可以被多个线程共享。它通常由第三方插件如EhCache、Infinispan等提供。二级缓存分为以下几种类型: 1. **集合缓存**:用于存储...
二级缓存是 Hibernate 缓存策略的一部分,它在应用程序的多个会话之间共享数据,进一步优化了数据库访问效率。 二级缓存分为以下关键知识点: 1. **一级缓存与二级缓存的区别**: - 一级缓存:每个 Hibernate ...
**Hibernate 二级缓存总结整理** 在Java的持久化框架中,Hibernate是一个广泛使用的ORM(对象关系映射)工具,它极大地简化了数据库操作。在处理大数据量或高并发的场景下,为了提高性能和减少数据库负载,...
通过以上步骤,我们就成功地在Spring Boot 2.1.4.RELEASE项目中配置了使用Redis作为Hibernate二级缓存的环境。这将显著提升数据库查询效率,减少对数据库的压力,尤其在高并发场景下,效果尤为明显。记得在实际生产...
以EhCache为例,我们需要在项目中引入ehcache-core或ehcache的依赖,并在Hibernate配置文件(hibernate.cfg.xml或persistence.xml)中启用二级缓存,添加如下配置: ```xml <property name="hibernate.cache.use_...
2. **配置Hibernate**:在Hibernate的配置文件`hibernate.cfg.xml`中启用二级缓存并指定缓存提供商。以下是一个使用Ehcache的示例: ```xml <property name="hibernate.cache.use_second_level_cache">true ...
本篇将详细介绍Hibernate二级缓存的概念、作用以及所需jar包的作用。 一、Hibernate二级缓存概念 Hibernate的一级缓存是指Session级别的缓存,每个Session内部都有一个一级缓存,用于存储实体对象,当Session关闭时...
本篇文章将深入探讨Hibernate二级缓存的概念、工作原理以及如何在实际项目中设置和使用。 **一、二级缓存概念** 一级缓存是每个Hibernate Session内部的一个内存区域,用于存储Session期间的操作对象。当Session...