很多人对二级缓存都不太了解,或者是有错误的认识,我一直想写一篇文章介绍一下hibernate的二级缓存的,今天终于忍不住了。
我的经验主要来自hibernate2.1版本,基本原理和3.0、3.1是一样的,请原谅我的顽固不化。
hibernate的session提供了一级缓存,每个session,对同一个id进行两次load,不会发送两条sql给数据库,但是session关闭的时候,一级缓存就失效了。
二级缓存是SessionFactory级别的全局缓存,它底下可以使用不同的缓存类库,比如ehcache、oscache等,需要设置hibernate.cache.provider_class,我们这里用ehcache,在2.1中就是
hibernate.cache.provider_class = net.sf.hibernate.cache.EhCacheProvider
如果使用查询缓存,加上
hibernate.cache.use_query_cache = true
缓存可以简单的看成一个Map,通过key在缓存里面找value。
Class的缓存
对于一条记录,也就是一个PO来说,是根据ID来找的,缓存的key就是ID,value是POJO。无论list,load还是iterate,只要读出一个对象,都会填充缓存。但是list不会使用缓存,而iterate会先取数据库select id出来,然后一个id一个id的load,如果在缓存里面有,就从缓存取,没有的话就去数据库load。假设是读写缓存,需要设置:
< cache usage = " read-write " />
如果你使用的二级缓存实现是ehcache的话,需要配置ehcache.xml
< cache name = " com.xxx.pojo.Foo "
maxElementsInMemory = " 500 "
eternal = " false "
timeToLiveSeconds = " 7200 "
timeToIdleSeconds = " 3600 "
overflowToDisk = " true " />
其中eternal表示缓存是不是永远不超时,timeToLiveSeconds是缓存中每个元素(这里也就是一个POJO)的超时时间,如果eternal="false",超过指定的时间,这个元素就被移走了。timeToIdleSeconds是发呆时间,是可选的。当往缓存里面put的元素超过500个时,如果overflowToDisk="true",就会把缓存中的部分数据保存在硬盘上的临时文件里面。
每个需要缓存的class都要这样配置。如果你没有配置,hibernate会在启动的时候警告你,然后使用defaultCache的配置,这样多个class会共享一个配置。
当某个ID通过hibernate修改时,hibernate会知道,于是移除缓存。
这样大家可能会想,同样的查询条件,第一次先list,第二次再iterate,就可以使用到缓存了。实际上这是很难的,因为你无法判断什么时候是第一次,而且每次查询的条件通常是不一样的,假如数据库里面有100条记录,id从1到100,第一次list的时候出了前50个id,第二次iterate的时候却查询到30至70号id,那么30-50是从缓存里面取的,51到70是从数据库取的,共发送1+20条sql。所以我一直认为iterate没有什么用,总是会有1+N的问题。
(题外话:有说法说大型查询用list会把整个结果集装入内存,很慢,而iterate只select id比较好,但是大型查询总是要分页查的,谁也不会真的把整个结果集装进来,假如一页20条的话,iterate共需要执行21条语句,list虽然选择若干字段,比iterate第一条select id语句慢一些,但只有一条语句,不装入整个结果集hibernate还会根据数据库方言做优化,比如使用mysql的limit,整体看来应该还是list快。)
如果想要对list或者iterate查询的结果缓存,就要用到查询缓存了
分享到:
相关推荐
而二级缓存则是在`SessionFactory`级别,虽然现在更多地被Redis等分布式缓存替代,但在某些场景下仍有一定价值。 验证一级缓存的存在,可以通过多次执行`session.get()`来观察结果。第一次获取对象时,Hibernate会...
为了提高性能,Hibernate支持第二级缓存。在源码中,我们可能看到配置了缓存插件,如Ehcache,以及如何启用和使用缓存的代码。缓存可以存储已加载的对象,避免重复的数据库查询。 ### 8. 关联映射 Hibernate支持...
hibernate培训第一天的课程主要围绕着Java对象持久化框架Hibernate展开,这是一款广泛应用于企业级开发中的ORM(Object-Relational Mapping)解决方案。在学习Hibernate的过程中,首先我们需要理解其核心概念,包括...
6. **缓存机制**:Hibernate提供了一级缓存(Session级别的)和二级缓存(SessionFactory级别的),提高了数据读取效率。 7. **对象状态**:Hibernate区分了瞬时、持久化、托管和脱管四种对象状态,理解这些状态...
Hibernate支持二级缓存,可以提高数据访问效率。通过配置插件如Ehcache,可以实现实体级别的缓存策略,减少对数据库的访问次数。 9. 异步操作与批处理 Hibernate提供了异步操作的支持,如Future和Async,可以优化...
9. **缓存机制**:为了提高性能,Hibernate引入了缓存机制,包括第一级缓存(Session缓存)和第二级缓存(可选)。理解缓存的工作原理和配置,可以有效优化应用程序性能。 10. **事务管理**:在Java应用中,事务...
二级缓存则可配置为全局共享,可以使用第三方缓存解决方案如Ehcache。理解缓存的工作原理以及如何配置和优化缓存是提升系统性能的关键。 **六、关联映射** hibernate支持多种关联映射,如一对一(@OneToOne)、一对...
第一天的学习主要围绕Hibernate的基本概念展开,包括Hibernate的核心组件、配置文件、实体类的创建以及持久化操作。首先,我们需要了解Hibernate的核心组件——SessionFactory和Session,它们是Hibernate工作流程中...
8. **第二级缓存**:Hibernate支持缓存机制,提高性能,第二级缓存可以跨会话共享,可以使用第三方缓存实现,如EhCache。 9. **事务管理**:Hibernate提供了集成的事务处理机制,可以基于JTA或JDBC进行事务控制。 ...
8. **缓存机制**: Hibernate3.3.2引入了第一级缓存和第二级缓存,提高了数据访问效率。第一级缓存是Session级别的,每个Session都有一个本地缓存;第二级缓存则可以跨Session共享,通常由插件如Ehcache实现。 9. **...
4. **第一天复习要点**: - **ORM原理**的深入讨论,包括对象持久化的必要性和各种持久化手段的优缺点。 - Hibernate的基本结构介绍,以及ORM的概念和作用。 5. **后续复习内容**: - 第二天可能涉及了更具体的...
6. **缓存机制**:一级缓存由SessionFactory管理,二级缓存可配置第三方缓存服务如Ehcache,提高性能。 7. **事件监听**:可以通过实现特定接口或者使用注解,实现在对象生命周期中的不同阶段执行自定义逻辑。 8. **...
在第一天的学习中,我们首先会接触到Hibernate的基础知识,包括它的历史、主要特点以及为什么要在项目中选择使用Hibernate。Hibernate简化了JDBC的繁琐操作,提供了一种面向对象的方式来操作数据库。它支持自动管理...
9. **缓存(Cache)**:Hibernate提供了两级缓存机制,一级缓存在Session级别,二级缓存则跨Session共享。缓存可以提高性能,减少对数据库的访问。 10. **事务管理(Transaction)**:Hibernate支持JTA(Java ...
5.1 第二级缓存:利用Hibernate的二级缓存提高性能,例如使用EHCache或Infinispan。 5.2 lazy loading:延迟加载策略,只在真正需要时加载关联对象,避免内存消耗过大。 5.3 分页查询:使用Criteria的...
在第一天的学习中,我们通常会从基础概念入手,了解Hibernate的核心功能和工作原理。Hibernate作为ORM框架,它允许开发者用面向对象的方式来操作数据库,极大地简化了数据持久化的复杂性。我们会学习如何配置...
6. **缓存策略**:Hibernate提供了第一级缓存和第二级缓存,这部分内容可能会讲解如何配置和使用它们,以提高数据访问效率。 7. **高级特性**:可能还会涉及到一对一、一对多、多对一、多对多的关联映射,以及懒...
7. **缓存机制**:解释Hibernate的第一级缓存和第二级缓存,以及如何配置和使用它们来提高性能。 8. **事务管理**:讨论Hibernate中的事务处理,包括自动提交、手动提交和回滚,以及事务隔离级别的概念。 通过深入...
10. 第二级缓存:了解Hibernate的二级缓存机制,它可以提高应用性能,通过缓存经常访问的数据,减少对数据库的直接访问。 11. 异常处理:学习Hibernate常见的异常,如ConstraintViolationException、...