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

hibernate二级缓存

阅读更多

二级缓存也称进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享
二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存

二级缓存的配置和使用:
 * 将echcache.xml文件拷贝到src下
 * 开启二级缓存,修改hibernate.cfg.xml文件
  <property name="hibernate.cache.use_second_level_cache">true</property>
 * 指定缓存产品提供商,修改hibernate.cfg.xml文件
  <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
 * 指定那些实体类使用二级缓存(两种方法)
  * 在映射文件中采用<cache>标签 如:<cache usage="read-write"/> 
  * 在hibernate.cfg.xml文件中,采用<class-cache>标签 如:

<class-cache class="com.bjsxt.hibernate.Student" usage="read-only"/>
  
二级缓存是缓存实体对象的

了解一级缓存和二级缓存的交互 

范例:

package com.bjsxt.hibernate;

import java.io.Serializable;

import org.hibernate.CacheMode;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import junit.framework.TestCase;

public class CacheLevel2Test extends TestCase {

 /**
  * 开启两个session,分别调用load
  */
 public void testCache1() {
  Session session = null;
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   Student student = (Student)session.load(Student.class, 2503);
   System.out.println("student.name=" + student.getName());
   
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
  
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   //不会发出sql,因为开启了二级缓存,session是共享二级缓存的
   Student student = (Student)session.load(Student.class, 2503);
   System.out.println("student.name=" + student.getName());
   
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
  
 } 
 
 /**
  * 开启两个session,分别调用get
  */
 public void testCache2() {
  Session session = null;
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   Student student = (Student)session.get(Student.class, 2503);
   System.out.println("student.name=" + student.getName());
   
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
  
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   //不会发出sql,因为开启了二级缓存,session是共享二级缓存的
   Student student = (Student)session.get(Student.class, 2503);
   System.out.println("student.name=" + student.getName());
   
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
 } 
 
 /**
  * 开启两个session,分别调用load,在使用SessionFactory清除二级缓存
  */
 public void testCache3() {
  Session session = null;
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   Student student = (Student)session.load(Student.class, 2503);
   System.out.println("student.name=" + student.getName());
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
  
  //管理二级缓存
  SessionFactory factory = HibernateUtils.getSessionFactory();
  //factory.evict(Student.class);
  factory.evict(Student.class, 2503);
  
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   //会发出查询sql,因为二级缓存中的数据被清除了
   Student student = (Student)session.load(Student.class, 2503);
   System.out.println("student.name=" + student.getName());
   
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
 }
 
 
 /**
  * 一级缓存和二级缓存的交互
  */
 public void testCache4() {
  Session session = null;
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   //仅向二级缓存读数据,而不向二级缓存写数据
   session.setCacheMode(CacheMode.GET);
   Student student = (Student)session.load(Student.class, 2503);
   System.out.println("student.name=" + student.getName());
   
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
  
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   //发出sql语句,因为session设置了CacheMode为GET,所以二级缓存中没有数据
   Student student = (Student)session.load(Student.class, 2503);
   System.out.println("student.name=" + student.getName());
   
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
  
  try {
   session = HibernateUtils.getSession();
   session.beginTransaction();
   
   //只向二级缓存写数据,而不从二级缓存读数据
   session.setCacheMode(CacheMode.PUT);
   
   //会发出查询sql,因为session将CacheMode设置成了PUT
   Student student = (Student)session.load(Student.class, 2503);
   System.out.println("student.name=" + student.getName());
   
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   session.getTransaction().rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
  
 } 
}

分享到:
评论

相关推荐

    Hibernate二级缓存

    Hibernate二级缓存是一种提高应用程序性能的技术,它将数据存储在SessionFactory级别的缓存中,使得数据可以在不同的Session之间共享。这与一级缓存(Session级别)不同,一级缓存仅存在于单个Session生命周期内,当...

    Hibernate 二级缓存

    Hibernate 二级缓存

    hibernate二级缓存实例

    在这个"hibernate二级缓存实例"中,我们将深入探讨二级缓存的原理、配置以及在实际项目中的应用。 首先,我们需要了解一级缓存和二级缓存的区别。一级缓存是Session级别的,每个Session都有自己的一级缓存,用于...

    hibernate 二级缓存详解

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

    hibernate二级缓存示例源码

    **hibernate二级缓存详解** Hibernate作为Java领域中广泛使用的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,在处理大量数据时,性能优化显得尤为重要,这就是二级缓存的作用。本文将深入探讨Hibernate...

    Hibernate 二级缓存 总结整理

    **Hibernate 二级缓存总结整理** 在Java的持久化框架中,Hibernate是一个广泛使用的ORM(对象关系映射)工具,它极大地简化了数据库操作。在处理大数据量或高并发的场景下,为了提高性能和减少数据库负载,...

    hibernate二级缓存包

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

    hibernate二级缓存java包下载

    二级缓存是 Hibernate 缓存策略的一部分,它在应用程序的多个会话之间共享数据,进一步优化了数据库访问效率。 二级缓存分为以下关键知识点: 1. **一级缓存与二级缓存的区别**: - 一级缓存:每个 Hibernate ...

    hibernate 二级缓存

    本篇文章将深入探讨Hibernate二级缓存的概念、工作原理以及如何在实际项目中设置和使用。 **一、二级缓存概念** 一级缓存是每个Hibernate Session内部的一个内存区域,用于存储Session期间的操作对象。当Session...

    hibernate二级缓存所需要的 jar包

    本篇将详细介绍Hibernate二级缓存的概念、作用以及所需jar包的作用。 一、Hibernate二级缓存概念 Hibernate的一级缓存是指Session级别的缓存,每个Session内部都有一个一级缓存,用于存储实体对象,当Session关闭时...

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

    本篇文章将深入探讨Hibernate的二级缓存机制,以及如何进行一级缓存与二级缓存的同步,同时还会介绍二级缓存的配置文件设置。 一级缓存是Hibernate默认提供的缓存,每个SessionFactory实例都有一个一级缓存。当对象...

Global site tag (gtag.js) - Google Analytics