`

转:Hibernate性能优化之二级缓存

阅读更多

http://chenhongbin007.blog.163.com/blog/static/3406992120094661950804/

 

转之方便自用。

 

二级缓存配置:    

   

1、首先要打开二级缓存,在hibernate.cfg.xml中添加如下配置:    

<property name="hibernate.cache.use_second_level_cache">true</property>   

   

2、Hibernate的二级缓存使用第三方的缓存工具来实现,所以我们需要指定Hibernate使用哪个    

   缓存工具。如下配置指定Hibernate使用EhCache缓存工具。    

<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>   

   

3、Hibernate在默认情况下并不会对所有实体对象进行缓存,所以,我们需要指定缓存哪些对象,    

在实体对象的映射文件中(相应的<class>标签内部),添加如下配置:    

<cache usage="read-only"/>   

   

usage="read-only"是“只读”缓存策略。    

   

注意,这个<cache>标签只能放在<class>标签的内部,而且必须处在<id>标签的前面!!!    

这个<cache>标签放在哪些<class>标签下面,就说明会对这些类的对象进行缓存    

   

4、对于第3步,有一个可选的方案是在hibernate.cfg.xml文件中指定哪些类的对象需要缓存,    

   而不需要使用<cache>标签来指定。如:    

   在hibernate.cfg.xml中添加如下配置:    

   <class-cache class="com.bjsxt.hibernate.Classes" usage="read-only" />   

      

   注意,这个<class-cache>标签必须放在<mapping>标签的后面!!  



--------------------------------------------------------------------------------







1、首先设置EhCache,建立配置文件ehcache.xml,默认的位置在class-path,可以放到你的src目录下: 

<?xml version="1.0" encoding="UTF-8"?> 

<ehcache> 

 <diskStore path="java.io.tmpdir"/> 

  <defaultCache 

   maxElementsInMemory="10000" <!-- 缓存最大数目 --> 

   eternal="false" <!-- 缓存是否持久 --> 

   overflowToDisk="true" <!-- 是否保存到磁盘,当系统当机时--> 

   timeToIdleSeconds="300" <!-- 当缓存闲置n秒后销毁 --> 

   timeToLiveSeconds="180" <!-- 当缓存存活n秒后销毁--> 

   diskPersistent="false" 

   diskExpiryThreadIntervalSeconds= "120"/> 

</ehcache> 

  2、在Hibernate配置文件中设置: 

<!-- 设置Hibernate的缓存接口类,这个类在Hibernate包中 --> 

<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property> 

 <!-- 是否使用查询缓存 --> 

 <property name="hibernate.cache.use_query_cache">true</property> 

  如果使用spring调用Hibernate的sessionFactory的话,这样设置: 

  <!--HibernateSession工厂管理 --> 

   <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 

   <property name="dataSource"> 

    <ref bean="datasource" /> 

   </property> 

   <property name="hibernateProperties"> 

   <props> 

    <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop> 

    <prop key="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop> 

    <prop key="hibernate.show_sql">true</prop> 

    <prop key="hibernate.cache.use_query_cache">true</prop> 

    <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> 

   </props> 

 </property> 

 <property name="mappingDirectoryLocations"> 

  <list> 

   <value>/WEB-INF/classes/cn/rmic/manager/hibernate/</value> 

  </list> 

 </property> 

</bean> 

  说明一下:如果不设置“查询缓存”,那么hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用 findall()、list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,就需要设置 

hibernate.cache.use_query_cache true 才行 

  3、在Hbm文件中添加<cache usage="read-only"/> 

  4、如果需要“查询缓存”,还需要在使用Query或Criteria()时设置其setCacheable(true);属性 

  5、实践出真知,给一段测试程序,如果成功的话第二次查询时不会读取数据库 

package cn.rmic.hibernatesample; 

import java.util.List; 

import org.hibernate.CacheMode; 

import org.hibernate.Criteria; 

import org.hibernate.Query; 

import org.hibernate.Session; 

import cn.rmic.hibernatesample.hibernate.HibernateSessionFactory; 

import cn.rmic.manager.po.Resources; 

public class testCacheSelectList ...{ 

 /** *//** 

 * @param args 

 */ 

 public static void main(String[] args) ...{ 

  // TODO Auto-generated method stub 

  Session s=HibernateSessionFactory.getSession(); 

  Criteria c=s.createCriteria(Resources.class); 

  c.setCacheable(true); 

  List l=c.list(); 

  // Query q=s.createQuery("From Resources r") 

  // .setCacheable(true) 

  // .setCacheRegion("frontpages") ; 

  // List l=q.list(); 

  Resources resources=(Resources)l.get(0); 

  System.out.println("-1-"+resources.getName()); 

  HibernateSessionFactory.closeSession(); 

  try ...{ 

   Thread.sleep(5000); 

  } catch (InterruptedException e) ...{ 

   // TODO Auto-generated catch block 

   e.printStackTrace(); 

  } 

  s=HibernateSessionFactory.getSession(); 

  c=s.createCriteria(Resources.class); 

  c.setCacheable(true); 

  l=c.list(); 

  // q=s.createQuery("From Resources r").setCacheable(true) 

  // .setCacheRegion("frontpages"); 

  // l=q.list(); 

  resources=(Resources)l.get(0); 

  System.out.println("-2-"+resources.getName()); 

  HibernateSessionFactory.closeSession(); 

 } 

} 

 

分享到:
评论

相关推荐

    Hibernate性能优化:一级缓存

    本文将深入探讨Hibernate性能优化中的一个重要概念——一级缓存,并结合给出的压缩包文件“hibernate_cache_level1”,来详细解析一级缓存的工作原理及其优化策略。 一级缓存是Hibernate内置的一种缓存机制,它存在...

    Hibernate性能优化:二级缓存

    二级缓存是Hibernate性能优化的重要手段,通过合理配置和使用,可以显著减少数据库访问,提高系统响应速度。但同时,需要注意缓存的副作用,如数据一致性、并发控制等问题。在实际应用中,需要结合业务场景和性能...

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

    本文将详细讲解Hibernate中的三级缓存:一级缓存、二级缓存和查询缓存。 ### 1. 一级缓存 一级缓存是Hibernate内置的Session级别的缓存,也被称为事务性缓存。每当我们在Session中进行对象的CRUD(创建、读取、...

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

    然后,在`hibernate.cfg.xml`配置文件中,指定缓存提供者,并开启二级缓存: ```xml &lt;property name="hibernate.cache.region.factory_class"&gt;org.hibernate.cache.ehcache.EhCacheRegionFactory &lt;property name="...

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

    总结来说,Hibernate 的一级缓存和二级缓存都是为了提高数据访问效率,但它们在范围和并发控制方面有所不同。一级缓存是事务级别的,保证了数据的强一致性,而二级缓存提供了更多的灵活性,可以跨事务共享,但需要...

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

    在本文中,我们将深入探讨如何在Spring Boot 2.1.4.RELEASE项目中结合JPA(Java Persistence API)和Hibernate实现Redis作为二级缓存。首先,我们需要理解这些技术的基本概念。 Spring Boot 是一个用于简化Spring...

    Hibernate一级缓存和二级缓存

    标题“Hibernate一级缓存和二级缓存”指的是Hibernate框架中的两种缓存机制,它们是提高数据访问性能的关键要素。一级缓存是Session级别的,而二级缓存是SessionFactory级别的,两者在数据库操作中起到了重要的作用...

    Spring集成的Hibernate配置二级缓存

    在企业级Java应用开发中,Spring和...总之,合理利用Hibernate的二级缓存机制,结合Spring的管理能力,可以有效地提升Java应用的性能。通过优化缓存配置和策略,可以在不牺牲数据一致性的情况下,达到良好的用户体验。

    day37 05-HIbernate二级缓存:一级缓存更新同步到二级缓存及二级缓存配置文件

    学习和掌握Hibernate的二级缓存机制对于优化大型应用的性能至关重要。通过合理配置和使用,可以在不牺牲数据一致性的情况下,大幅度减少对数据库的访问,提高系统响应速度。在实际项目中,可以根据业务需求和系统...

    hibernate二级缓存实例

    总的来说,"hibernate二级缓存实例"是一个很好的学习资源,它可以帮助我们理解二级缓存的工作机制,掌握如何在项目中配置和使用,以及注意潜在的问题和优化策略。通过实践,我们可以更好地运用这一技术,提升Java...

    hibernate二级缓存java包下载

    - 二级缓存:是全局的,跨越多个 Session 和 Transaction,由缓存提供者管理。二级缓存允许在不同的 JVM 之间共享数据,但需要注意并发控制和数据一致性问题。 2. **二级缓存的作用**: - 减少数据库访问:避免...

    Hibernate4二级缓存实例(源码)

    6. **性能优化**:利用二级缓存能够显著减少数据库查询,但需要注意缓存同步和更新策略,避免数据不一致。例如,更新数据库时,必须正确处理缓存的清除或更新。 7. **分布式环境中的应用**:在分布式环境中,多台...

    hibernate5.1二级缓存包

    在 Hibernate 中,二级缓存是一个重要的性能优化工具,尤其是在处理大量数据或者高并发场景时。这个"hibernate5.1二级缓存包"应该包含了用于实现二级缓存的相关组件和配置。 二级缓存是相对于一级缓存(Session ...

    Hibernate缓存,性能优化

    Hibernate缓存主要分为一级缓存和二级缓存。一级缓存,也称为会话缓存(Session Cache),是默认启用的,由Hibernate自动管理。它存储了当前会话期间加载的所有实体对象和关联的集合对象。当会话关闭时,一级缓存中...

    Hibernate 二级缓存 总结整理

    通过理解和运用Hibernate的二级缓存,我们可以优化应用性能,减少数据库压力,但同时也需要注意缓存可能带来的问题,如数据一致性、内存管理和并发控制等。在实际项目中,结合业务需求和系统特点,合理配置和管理...

    hibernate二级缓存包

    Hibernate二级缓存是Java开发中使用Hibernate框架进行数据持久化时优化性能的一种重要技术。它在一级缓存(Session级别的缓存)的基础上,提供了一个全局的、跨会话的数据存储层,可以显著减少对数据库的访问,从而...

    hibernate二级缓存示例源码

    然而,在处理大量数据时,性能优化显得尤为重要,这就是二级缓存的作用。本文将深入探讨Hibernate二级缓存的基本概念、工作原理及如何通过示例源码实现。 ### 1. 二级缓存概述 Hibernate的一级缓存是Session级别的...

    hibernate 二级缓存

    在Java的持久化框架Hibernate中,二级缓存是提高应用程序性能的重要工具。它是一个全局共享的、跨会话的缓存,存储了实体对象的副本,以减少对数据库的访问次数,从而提升系统性能。本篇文章将深入探讨Hibernate二级...

    项目中使用 hibernate-memcached 做二级缓存

    本文将详述如何在项目中使用Hibernate与Memcached结合实现二级缓存,并探讨Memcached的基本原理和使用方法。 首先,我们需要理解什么是Hibernate的二级缓存。在Hibernate框架中,一级缓存是每个Session级别的,它...

Global site tag (gtag.js) - Google Analytics