`
yysct2005
  • 浏览: 90677 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Hibernate缓存管理 2

    博客分类:
  • java
阅读更多
++YONG原创,转载请注明
配置的元素说明:
元素或属性
描述
<diskStore>
设置缓存数据文件的存放目录
<defaultCache>
设置缓存的默认数据过期策略
<cache>
设定具体的命名缓存的数据过期策略
每个命名缓存代表一个缓存区域,每个缓存区域有各自的数据过期策略。命名缓存机制使得用户能够在每个类以及类的每个集合的粒度上设置数据过期策略。
cache元素的属性
 
name
设置缓存的名字,它的取值为类的全限定名或类的集合的名字
maxInMemory
设置基于内存的缓存中可存放的对象最大数目
eternal
设置对象是否为永久的,true表示永不过期,此时将忽略timeToIdleSecondstimeToLiveSeconds属性;
默认值是false
timeToIdleSeconds
设置对象空闲最长时间,超过这个时间,对象过期。当对象过期时,EHCache会把它从缓存中清除。
如果此值为0,表示对象可以无限期地处于空闲状态。
timeToLiveSeconds
设置对象生存最长时间,超过这个时间,对象过期。
如果此值为0,表示对象可以无限期地存在于缓存中。
overflowToDisk
设置基于内在的缓存中的对象数目达到上限后,是否把溢出的对象写到基于硬盘的缓存中
 
3)      写一测试类:
package org.qiujy.test.cache;
 
import java.util.List;
 
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.qiujy.common.HibernateSessionFactory;
import org.qiujy.domain.cachedemo.Product;
 
public class TestCache {
 
       public static void main(String[] args) {
       
              //test cache.........
              Session session2 = HibernateSessionFactory.getSession();
              Transaction tx2 =null;
             
              try{
                     tx2 = session2.beginTransaction();
                    
                     List list = session2.createQuery("from Product").list();
                    
                     for(int i = 0 ; i < list.size(); i++){
                            Product prod = (Product)list.get(i);
                            System.out.println(prod.getName());
                     }
                    
                    tx2.commit();
              }catch(HibernateException e){
                     if(tx2 != null){
                            tx2.rollback();
                     }
                     e.printStackTrace();
              }finally{
                     HibernateSessionFactory.closeSession();
              }
             
              //-------------------
              Session session3 = HibernateSessionFactory.getSession();
              Transaction tx3 =null;
             
              try{
                     tx3 = session3.beginTransaction();
                    
                     Product prod = (Product)session3.get(Product.class, new Long(1));
                     System.out.println("从cache中得到,不执行SQL---" + prod.getName());
                 
                    tx3.commit();
              }catch(HibernateException e){
                     if(tx3 != null){
                            tx3.rollback();
                     }
                     e.printStackTrace();
              }finally{
                     HibernateSessionFactory.closeSession();
              }
       }
}
首先数据库插入1000条产品记录和1条类别记录。此1000个产品都属于这一类别。然后执行以上测试类,在Session2中查询所有的产品,输出它的产品名,Session2会把这些数据加载到二级缓存中,由于有1000个对象,而配置中定义内存中只能存放500个,剩下的对象就会写到指定的磁盘目录中缓存起来。所以在磁盘相应位置可看到数据文件:
2.5.    查询缓存(Query Cache)
对于经常使用的查询语句,如果启用了查询缓存,当第一次执行查询语句时,Hibernate会把查询结果存放在第二缓存中。以后再次执行该查询语句时,只需从缓存中获得查询结果,从而提高查询性能。
2.5.1.      查询缓存适用于以下场合:
在应用程序运行时经常使用的查询语句。
很少对与查询语句关联的数据库数据进行插入、删除或更新操作。
2.5.2.      HibernateQuery缓存策略的过程如下:
1) Hibernate首先根据这些信息组成一个Query Key,Query Key包括条件查询的请求一般信息:SQL, SQL需要的参数,记录范围(起始位置rowStart,最大记录个数maxRows),等。
2) Hibernate根据这个Query Key到Query缓存中查找对应的结果列表。如果存在,那么返回这个结果列表;如果不存在,查询数据库,获取结果列表,把整个结果列表根据Query Key放入到Query缓存中。
3) Query Key中的SQL涉及到一些表名,如果这些表的任何数据发生修改、删除、增加等操作,这些相关的Query Key都要从缓存中清空。
只有当经常使用同样的参数进行查询时,这才会有些用处。
启用查询缓存的步骤:
1)      配置二级缓存:
Hibernate提供了三种和查询相关的缓存区域:
默认的查询缓存区域:org.hibernate.cache.StandardQueryCache
用户自定义的查询缓存区域:
时间戳缓存区域:org.hibernate.cache.UpdateTimestampCache
默认的查询缓存区域以及用户自定义的查询缓存区域都用于存放查询结果。而时间戳缓存区域存放了对与查询结果相关的表进行插入、更新或删除操作的时间戳。Hibernate通过时间戳缓存区域来判断被缓存的查询结果是否过期。所以,当应用程序对数据库的相关数据做了修改,Hibernate会自动刷新缓存的查询结果。但是如果其他应用程序对数据库的相关数据做了修改,则无法监测,此时必须由应用程序负责监测这一变化,然后手工刷新查询结果。Query接口的setForceCacheRefresh(true)可以手工刷新查询结果。
在ehcache.xml中添加如下配置:
<!-- 设置默认的查询缓存的数据过期策略 -->
    <cache name="org.hibernate.cache.StandardQueryCache"
       maxElementsInMemory="50"
       eternal="false"
       timeToIdleSeconds="3600"
       timeToLiveSeconds="7200"
       overflowToDisk="true"/>
        
    <!-- 设置时间戳缓存的数据过期策略 -->
    <cache name="org.hibernate.cache.UpdateTimestampsCache"
       maxElementsInMemory="5000"
       eternal="true"
       overflowToDisk="true"/>
   
    <!-- 设置自定义命名查询缓存customerQueries的数据过期策略 -->
    <cache name="myCacheRegion"
        maxElementsInMemory="1000"
        eternal="false"
        timeToIdleSeconds="300"
        timeToLiveSeconds="600"
        overflowToDisk="true"
        />
 
2)      打开查询缓存:在hibernate.cfg.xml添加如下配置
<!--启用查询缓存 -->
<property name="cache.use_query_cache">true</property>
 
3)      在程序中使用:
虽然按以上设置好了查询缓存,但Hibernate在执行查询语句语句时仍不会启用查询缓存。对于希望启用查询缓存的查询语句,应该调用Query接口的setCacheeable(true)方法:
       测试类如下:
package org.qiujy.test.cache;
 
import java.util.List;
 
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.qiujy.common.HibernateSessionFactory;
import org.qiujy.domain.cachedemo.Product;
 
public class TessQueryCache {
 
       public static void main(String[] args) {
              Session session = HibernateSessionFactory.getSession();
              Transaction tx =null;
             
              try{
                     tx = session.beginTransaction(); 
                     Query query = session.createQuery("from Product");
                     //激活查询缓存
                     query.setCacheable(true);
                     //使用自定义的查询缓存区域,若不设置,则使用标准查询缓存区域
                     query.setCacheRegion("myCacheRegion");
                    
                     List list = query.list();
                     for(int i = 0 ; i < list.size(); i++){
                            Product prod = (Product)list.get(i);
                            System.out.println(prod.getName());
                     }
                    
                    tx.commit();
              }catch(HibernateException e){
                     if(tx != null){
                            tx.rollback();
                     }
                     e.printStackTrace();
              }finally{
                     HibernateSessionFactory.closeSession();
              }
       }
}
分享到:
评论

相关推荐

    Hibernate缓存管理.doc

    【Hibernate缓存管理】是数据库持久化框架Hibernate中优化性能的关键技术。缓存的主要目的是减少对数据库的直接访问,提高应用程序的运行效率。缓存的数据是数据库中数据的副本,存在于内存或硬盘中,便于快速读取。...

    hibernate缓存机制

    Hibernate缓存机制是提高应用程序性能的关键技术之一,它通过存储数据副本减少对物理数据库的访问。缓存可以分为两层:第一级缓存和第二级缓存。 **第一级缓存**是内置在Session中的,它是不可卸载的,也称为...

    Hibernate缓存,性能优化

    综上所述,Hibernate缓存机制是提升应用性能的重要手段,通过合理配置缓存策略、优化查询方式、管理数据库连接以及实施有效的监控和调优措施,可以显著提高Hibernate应用的运行效率和用户体验。然而,缓存的使用并非...

    hibernate缓存和事务

    Hibernate 是一个流行的对象关系映射(ORM)框架,它允许Java...通过理解Hibernate缓存和事务管理,以及如何有效地执行查询,开发者可以创建高效、健壮的Java应用程序,降低与数据库交互的复杂性,同时提升系统性能。

    Hibernate缓存深入详解

    【Hibernate缓存深入详解】 在Java的持久化框架Hibernate中,缓存机制是提升系统性能的关键因素。它位于Hibernate应用和数据库之间,减少了对数据库的直接访问,从而提高了应用程序的运行速度。缓存中存储的是...

    Hibernate缓存与spring事务详解

    **标题:“Hibernate缓存与Spring事务详解”** 在IT领域,尤其是Java开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,极大地简化了数据库操作。而Spring框架则以其全面的功能,包括依赖注入、AOP(面向切...

    hibernate缓存

    ### Hibernate缓存机制及优化策略 #### 一、概述 Hibernate作为一款优秀的对象关系映射(ORM)框架,在Java开发领域被广泛应用于数据库操作。它提供了丰富的缓存机制来提高应用性能并降低数据库访问压力。本文将...

    管理Hibernate的缓存

    管理Hibernate的缓存缓存 管理Hibernate的缓存缓存

    hibernate缓存ehcache用法

    这篇博客文章“hibernate缓存ehcache用法”可能详细介绍了如何在Hibernate中配置和使用Ehcache。 首先,我们需要理解什么是缓存。缓存是一种存储技术,用于临时保存经常访问的数据,以减少对主存储器(如数据库)的...

    Hibernate缓存管理

    ### Hibernate缓存管理详解 #### 一、缓存概述 **缓存(Cache)**是在计算机领域中广泛应用的一种技术手段,其主要目的是提高应用程序的运行效率。缓存位于应用程序与永久性数据存储(例如硬盘上的文件或数据库)...

    Hibernate教程25_Hibernate缓存

    **标题解析:** "Hibernate教程25_Hibernate缓存" 这个标题表明了我们要讨论的是关于Hibernate框架的第25个教程,重点是它的缓存机制。Hibernate是一个流行的Java对象关系映射(ORM)框架,它允许开发者用面向对象的...

    Hibernate缓存管理[参照].pdf

    【Hibernate缓存管理】 在软件开发中,尤其是涉及到数据库操作时,优化性能是至关重要的,而Hibernate作为一种流行的Java ORM框架,提供了缓存机制来提升数据访问速度。缓存是计算机系统中常用的一种技术,用于存储...

    Hibernate 缓存管理

    **Hibernate缓存管理详解** 在Java的持久化框架中,Hibernate是一个非常重要的工具,它极大地简化了数据库操作。其中,缓存管理是Hibernate的核心特性之一,对于提高应用程序性能有着显著的作用。本文将深入探讨...

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

    二级缓存则是一个可配置的、进程范围的缓存,由 SessionFactory 管理。它可以跨多个 Session 共享数据,甚至可以在多线程或多进程环境下使用。二级缓存可以是内存中的缓存,也可以扩展到硬盘,例如使用第三方缓存...

    HIBERNATE的缓存机制

    Hibernate缓存机制是提高应用程序性能的关键特性,尤其是在频繁与数据库交互的应用中。缓存通过减少对物理数据库的直接访问次数,显著提升了数据读取和写入的速度。这主要是因为从缓存中读取数据比从数据库中获取更...

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

    - **自动管理**:Hibernate会自动管理一级缓存,无需开发者额外配置。 - **线程安全**:由于每个Session对应一个线程,因此一级缓存是线程安全的。 - **优化性能**:通过一级缓存,可以避免频繁的数据库往返,提升...

Global site tag (gtag.js) - Google Analytics