`

hibernate 2级缓存

阅读更多
二级缓存也称进程级的缓存或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-only"/>
   
   -->
        * 在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, 1);
            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, 1);
            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, 1);
            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, 1);
            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, 1);
            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, 1);
       
        try {
            session = HibernateUtils.getSession();
            session.beginTransaction();
           
            //会发出查询sql,因为二级缓存中的数据被清除了
            Student student = (Student)session.load(Student.class, 1);
            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, 1);
            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, 1);
            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, 1);
            System.out.println("student.name=" + student.getName());
           
            session.getTransaction().commit();
        }catch(Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally {
            HibernateUtils.closeSession(session);
        }
       
    }  
}
分享到:
评论

相关推荐

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

    它是一个事务范围的缓存,也就是说,每个 Hibernate Session 对应一个一级缓存,仅在当前事务中有效。一级缓存主要存储了 Session 在当前事务中加载和修改的对象实例。当 Session 执行 CRUD 操作时,对象会自动放入...

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

    **hibernate一级缓存、二级缓存和查询缓存** 在Java的持久化框架Hibernate中,缓存机制是提高应用程序性能的关键要素。缓存能够减少数据库的访问次数,提高数据读取速度,并且在一定程度上降低了系统的负载。本文将...

    hibernate二级缓存实例

    2. 配置Hibernate:在hibernate.cfg.xml文件中启用二级缓存,并指定使用Ehcache作为二级缓存提供者。 3. 配置实体类:在实体类上使用`@Cacheable`、`@Cache`等注解,声明该类及属性参与缓存。 4. 配置缓存策略:...

    Hibernate二级缓存

    2. **配置二级缓存**:在`hibernate.cfg.xml`配置文件中,需要指定二级缓存的提供商。例如,添加如下配置来启用ehcache: ```xml &lt;property name="hibernate.cache.region.factory_class"&gt;org.hibernate.cache....

    Hibernate一级缓存和二级缓存

    描述中提到的链接可能是对Hibernate缓存机制的详细技术博客,但具体内容未给出。因此,我们将基于常规的Hibernate缓存知识进行解释。 **一、Hibernate一级缓存** 一级缓存是每个Hibernate Session内的缓存,它是一...

    hibernate 二级缓存详解

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

    hibernate二级缓存示例源码

    2. **SessionFactory配置**:在`hibernate.cfg.xml`或`persistence.xml`中,配置了二级缓存插件,并引用了配置文件。 3. **缓存插件配置**:在`ehcache.xml`中,定义了缓存区域和缓存策略。 4. **业务逻辑**:在服务...

    Hibernate一级缓存、二级缓存以及查询缓存实例

    本文将深入探讨Hibernate的一级缓存、二级缓存以及查询缓存,通过具体的实例来阐述它们的工作原理和使用方法。 首先,我们从一级缓存开始。一级缓存是Hibernate默认提供的缓存,它是每个Session级别的,也被称为...

    hibernate二级缓存包

    2. **Ehcache配置**:在Hibernate配置文件中,我们需要指定使用Ehcache作为二级缓存提供者,并设置相应的配置参数,如缓存大小、过期策略等。此外,还需要在项目的类路径下放置Ehcache的配置文件,以定义具体的缓存...

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

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

    hibernate一级缓存

    2. **缓存与数据库的同步**:当我们调用`Session.flush()`方法时,Hibernate会将一级缓存中所有更改过的对象同步到数据库,确保数据的一致性。而在事务提交(`Transaction.commit()`)时,Hibernate会自动执行flush...

    Hibernate 二级缓存

    Hibernate 二级缓存

    hibernate二级缓存

    Hibernate 二级缓存是一种高效的数据存储机制,它能够显著提升Web应用的性能,尤其是在处理大量数据流动时。缓存的主要目标是减少应用与数据库之间的交互次数,从而降低延迟并减轻数据库服务器的压力。在Hibernate...

    hibernate二级缓存java包下载

    2. **二级缓存的作用**: - 减少数据库访问:避免频繁的 SQL 查询,提高系统性能。 - 提供数据共享:在多用户环境下,缓存可以减少对数据库的竞争。 - 提升应用响应速度:缓存中的数据读取速度远快于数据库。 3....

    Hibernate 一级缓存和二级缓存的区别

    Hibernate 一级缓存和二级缓存的区别

    Hibernate 二级缓存 总结整理

    2. **缓存提供者(Cache Provider)**:Hibernate通过缓存提供者来实现二级缓存,常见的有Ehcache、Infinispan等。缓存提供者负责存储和检索数据,以及缓存的同步和过期策略。 3. **缓存策略(Cache Strategy)**:...

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

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

    为Spring集成的Hibernate配置二级缓存

    2. **配置Hibernate**:在Hibernate的配置文件`hibernate.cfg.xml`中启用二级缓存并指定缓存提供商。以下是一个使用Ehcache的示例: ```xml &lt;property name="hibernate.cache.use_second_level_cache"&gt;true ...

    hibernate二级缓存所需要的 jar包

    2. 配置Hibernate的`persistence.xml`或`hibernate.cfg.xml`文件,指定二级缓存提供商(如Ehcache)。 3. 在实体类或映射文件上使用`@Cacheable`、`@Cache`等注解来指定哪些类或方法应该被缓存。 4. 在...

    Spring集成的Hibernate配置二级缓存

    在Hibernate中,一级缓存是每个Session内部的缓存,它自动管理实体的状态,当一个实体被加载到Session后,该实体的状态就会被缓存。然而,一级缓存的范围仅限于单个Session,当Session关闭后,其中的数据就会丢失。...

Global site tag (gtag.js) - Google Analytics