`
hui525
  • 浏览: 10689 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Hibernate获取数据方式与缓存使用

    博客分类:
  • java
阅读更多

Hibernate获取数据的方式有不同的几种,其与缓存结合使用的效果也不尽相同,而Hibernate中具体怎么使用缓存其实是我们很关心的一个问题,直接涉及到性能方面。
缓存在Hibernate中主要有三个方面:一级缓存、二级缓存和查询缓存;一级缓存在Hibernate中对应的即为session范围的缓存,也就是当 session关闭时缓存即被清除,一级缓存在Hibernate中是不可配置的部分;二级缓存在Hibernate中对应的即为 SessionFactory范围的缓存,通常来讲SessionFactory的生命周期和应用的生命周期相同,所以可以看成是进程缓存或集群缓存,二级缓存在Hibernate中是可以配置的,可以通过class-cache配置类粒度级别的缓存(class-cache在class中数据发生任何变化的情况下自动更新),同时也可通过collection-cache配置集合粒度级别的缓存(collection-cache仅在 collection中增加了元素或者删除了元素的情况下才自动更新,也就是当collection中元素发生值的变化的情况下它是不会自动更新的),缓存自然会带来并发的访问问题,这个时候相应的就要根据应用来设置缓存所采用的事务隔离级别,和数据库的事务隔离级别概念基本一样,没什么多介绍的, ^_^;查询缓存在Hibernate同样是可配置的,默认是关闭的,可以通过设置cache.use_ query_cache为true来打开查询缓存。根据缓存的通常实现策略,我们可以来理解Hibernate的这三种缓存,缓存的实现通过是通过key/value的Map方式来实现,在 Hibernate的一级、二级和查询缓存也同样如此,一级、二级缓存使用的key均为po的主键ID,value即为po实例对象,查询缓存使用的则为查询的条件、查询的参数、查询的页数,value有两种情况,如果采用的是select po.property这样的方式那么value为整个结果集,如采用的是from这样的方式那么value为获取的结果集中各po对象的主键ID,这样的作用很明显,节省内存,^_^
简单介绍完Hibernate的缓存后,再结合Hibernate的获取数据方式来说明缓存的具体使用方式,在Hibernate中获取数据常用的方式主要有四种:Session.load、Session.get、Query.list、Query.iterator。
1、Session.load
      在执行session.load时,Hibernate首先从当前session的一级缓存中获取id对应的值,在获取不到的情况下,将根据该对象是否配置了二级缓存来做相应的处理,如配置了二级缓存,则从二级缓存中获取id对应的值,如仍然获取不到则还需要根据是否配置了延迟加载来决定如何执行,如未配置延迟加载则从数据库中直接获取,在从数据库获取到数据的情况下,Hibernate会相应的填充一级缓存和二级缓存,如配置了延迟加载则直接返回一个代理类,只有在触发代理类的调用时才进行数据库查询的操作。
      在这样的情况下我们就可以看到,在session一直打开的情况下,要注意在适当的时候对一级缓存进行刷新操作,通常是在该对象具有单向关联维护的时候,在Hibernate中可以使用象session.clear、session.evict的方式来强制刷新一级缓存。
      二级缓存则在数据发生任何变化(新增、更新、删除)的情况下都会自动的被更新。


2、Session.get
      在执行Session.get时,和Session.load不同的就是在当从缓存中获取不到时,直接从数据库中获取id对应的值。
3、Query.list
      在执行Query.list时,Hibernate的做法是首先检查是否配置了查询缓存,如配置了则从查询缓存中查找key为查询语句+查询参数+分页条件的值,如获取不到则从数据库中进行获取,从数据库获取到后Hibernate将会相应的填充一级、二级和查询缓存,如获取到的为直接的结果集,则直接返回,如获取到的为一堆id的值,则再根据id获取相应的值(Session.load),最后形成结果集返回,可以看到,在这样的情况下,list也是有可能造成N次的查询的。
      查询缓存在数据发生任何变化的情况下都会被自动的清空。
4、Query.iterator
      在执行Query.iterator时,和Query.list的不同的在于从数据库获取的处理上,Query.iterator向数据库发起的是 select id from这样的语句,也就是它是先获取符合查询条件的id,之后在进行iterator.next调用时才再次发起session.load的调用获取实际的数据。
      可见,在拥有二级缓存并且查询参数多变的情况下,Query.iterator会比Query.list更为高效。

Query上有list()與iterator()方法,兩者的差別在於list()方法在讀取資料時,並不會利用到快取,而是直接再向資料庫查詢,而iterator()則將讀取到的資料寫到快取,並於讀取時再次利用。

來看看下面的程式:
這個程式片段會使用兩次SQL來查詢資料庫:

 

Session session = sessionFactory.openSession();

Query query = session.createQuery("from User");

List users = query.list(); 

users = query.list(); 

session.close(); 

 

sql输出情况:

Hibernate: select user0_.id as id, user0_.name as name0_, user0_.age as age0_ from user user0_ 

Hibernate: select user0_.id as id, user0_.name as name0_, user0_.age as age0_ from user user0_ 


 

 
如果在Session關閉之前,要再將所有資料在取出,可以使用iterator()方法,例如:


 

Session session = sessionFactory.openSession(); 

Query query = session.createQuery("from User");

Iterator users = query.iterate(); 

users = query.iterate();

session.close(); 

 


這個程式片段會使用一次SQL向資料庫查詢,第二次則直接從快取中取得資料:

Hibernate: select user0_.id as col_0_0_ from user user0_ 

 
由於使用iterator()方法時會使用到Session level快取,所以在查詢大量資料時,會耗用大量的記憶體,必要時可以使用Session的evict()或clear()方法來清除快取。

分享到:
评论

相关推荐

    Hibernate + EhCache 实现数据缓存的处理

    本篇将详细探讨如何使用Hibernate ORM框架结合EhCache实现数据缓存的处理,从而提高系统的响应速度。 Hibernate是一个流行的Java持久化框架,它提供了一种便捷的方式来映射对象关系模型(ORM)到关系数据库。然而,...

    Hibernate 使用缓存时,数据同步问题

    ### Hibernate使用缓存时的数据同步问题详解 #### 引言 在现代软件开发中,ORM框架如Hibernate被广泛应用于数据库操作,以简化Java应用程序与数据库之间的交互。然而,使用Hibernate时,缓存机制的合理配置对于...

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

    缓存的配置与使用 在实际项目中,合理配置和使用缓存可以极大地提升应用性能。这包括选择合适的缓存提供商、设置缓存策略、决定哪些实体或查询结果应放入缓存等。开发者需要根据业务需求和系统负载进行权衡,以...

    Spring集成的Hibernate配置二级缓存

    2. **配置实体缓存策略**:针对每个需要缓存的实体,我们需要在对应的映射文件(.hbm.xml)或者使用注解方式声明缓存策略。例如,我们可以使用`@Cacheable`和`@Cache`注解: ```java @Entity @Table(name = "USER...

    使用Hibernate缓存数据.ppt

    - **数据更新**:对于频繁更新的数据,使用二级缓存的意义不大,因为需要频繁同步缓存与数据库,反而可能导致数据不一致。 - **范围分类**:二级缓存分为事务范围、进程范围和集群范围: - **事务范围**:只对当前...

    hibernate开启二级缓存和查询缓存

    一级缓存与二级缓存 #### 1.1 一级缓存 一级缓存是 Hibernate 内置的 Session 缓存,它是每个 Hibernate Session 的私有缓存。当对象被加载到 Session 中时,它们会被自动缓存。在同一个 Session 内部,对相同...

    深入理解Hibernate缓存

    在Hibernate中,可以通过以下方式触发缓存失效: - **数据更新**:当缓存中的数据被更新后,旧数据会从缓存中移除。 - **显式清除**:可以显式调用`evict()`方法从缓存中移除某个实体或所有实体。 ### 结语 本文...

    springboot+jpa(hibernate配置redis为二级缓存) springboot2.1.4

    创建一个简单的服务,查询并查看是否从缓存中获取数据,例如: ```java @RestController public class MyController { @Autowired private MyEntityRepository repository; @GetMapping("/test") public ...

    Hibernate二级缓存

    这与一级缓存(Session级别)不同,一级缓存仅存在于单个Session生命周期内,当Session关闭时,一级缓存中的数据会丢失。二级缓存的存在减少了对数据库的直接访问,从而提高了数据读取速度。 为了启用Hibernate的二...

    hibernate的_映射、三态、脏数据、Session缓存

    ### Hibernate的映射、三态、脏数据、Session缓存详解 #### 一、Hibernate映射 **Hibernate映射**是Hibernate框架的核心功能之一,它实现了Java对象与数据库表之间的映射关系。通过这种方式,开发人员可以使用面向...

    hibernate 二级缓存详解

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

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

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

    Hibernate4二级缓存实例(源码)

    这里它被用作Hibernate二级缓存的实现方式,这意味着当数据首次从数据库中读取后,会被存储在memcached中,后续请求可以直接从缓存中获取,避免了频繁的数据库交互,从而提高了系统的响应速度。 **知识点详解:** ...

    Hibernate一级缓存和二级缓存

    Hibernate的一级缓存和二级缓存是提高数据访问效率的重要手段,它们各自承担着不同的角色,合理使用可以显著提升应用性能。然而,缓存的使用也需要谨慎,需要根据具体业务场景选择合适的缓存策略,并关注可能带来的...

    hibernate二级缓存实例

    在Java的持久化框架Hibernate中,二级缓存是提高数据访问效率的重要机制。它是一种全局共享的、跨会话的数据存储区域,旨在减少对数据库的直接访问,从而降低系统负载,提升性能。在这个"hibernate二级缓存实例"中,...

    Hibernate教程25_Hibernate缓存

    5. **缓存同步**:为了确保数据一致性,Hibernate提供了一些机制来同步缓存与数据库,如使用版本号或时间戳进行脏检查。 6. **缓存优化**:正确配置缓存的大小、过期策略和缓存级别对于性能提升至关重要。过度缓存...

    Hibernate缓存技术研究

    然而,由于对象模型和关系型数据库模型之间的映射会产生一定的性能开销,Hibernate引入了一套缓存机制来提高数据访问的效率。 #### 二、Hibernate的缓存结构 Hibernate的缓存机制分为两层:第一级缓存(Session...

    hibernate的一级缓存和二级缓存

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

    Hibernate缓存深入详解

    缓存中存储的是数据库数据的副本,当需要查询数据时,Hibernate会首先在缓存中查找,如果找到,就直接返回,避免了数据库查询的开销。 **1. Hibernate缓存概述** Hibernate提供了两级缓存:一级缓存和二级缓存。一...

Global site tag (gtag.js) - Google Analytics