Spring 整合 Hibernate 时启用二级缓存实例详解

yizhihongxing

我会给出一个详细的“Spring 整合 Hibernate 时启用二级缓存实例详解”的攻略。在这个攻略中,我会从以下几个方面来进行阐述:

  1. 为什么在整合 Spring 和 Hibernate 时需要使用二级缓存?
  2. 什么是二级缓存?Spring 如何支持 Hibernate 的二级缓存?
  3. 如何在Spring 和Hibernate 中启用二级缓存?
  4. 通过两个示例来说明如何在Spring 和 Hibernate 中使用二级缓存。

为什么在整合 Spring 和 Hibernate 时需要使用二级缓存?

在使用 Hibernate 进行数据访问过程中,由于数据访问是通过 SQL 语句执行的,因此当频繁的进行数据库访问时会带来较大的性能开销,从而导致系统处理缓慢。通过启用 Hibernate 的二级缓存,可以将 Hibernate 对象缓存在内存中,减少了对数据库的频繁访问,这样可以显著的提高系统的性能响应速度,提高系统的吞吐量。

什么是二级缓存?Spring 如何支持 Hibernate 的二级缓存?

为了解释什么是Hibernate的二级缓存,我们需要先介绍Hibernate的一级缓存。Hibernate中的一级缓存是Session级别的缓存,如果一个对象在一个Session中被加载了一次,那么在同一个Session中就只会从缓存中获取该对象,而不会再次访问数据库。在Hibernate中,只有唯一的一个SessionFactory,每个Session工厂都相当于一个独立的Hibernate运行环境。这意味着不同的Session实例之间不能共享数据,也就是说,Session之间的对象缓存也是独立的。

相对应的, Hibernate 的二级缓存则是SessionFactory级别的缓存,它可以存储位于不同Session中的相同对象。当需要访问一个对象时,如果它已经在缓存中,那么就不需要访问数据库从而提高性能。Hibernate 通过支持第三方缓存库实现了二级缓存功能,比如 EhCache。

Spring对Hibernate的缓存支持是通过Spring和Hibernate的集成来实现的,它不仅支持Hibernate的并发缓存,还支持Hibernate的二级缓存。

如何在Spring 和 Hibernate 中启用二级缓存?

要启用 Hibernate 的二级缓存,我们需要采用以下几个步骤。

1. 在Hibernate配置文件中设置二级缓存

<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

2. 配置缓存区域和策略。

在hibernate.cfg.xml文件中配置缓存策略和缓存区域,Hibernate通过支持第三方缓存库来实现,我们将使用Ehcache作为缓存策略,这个缓存策略必须在配置文件中通过factory_class属性来加载。类型属性必须是ehcache。每个缓存区域都必须指定一个唯一的名称和缓存策略。

<property name="hibernate.cache.region_prefix">sample-app</property>
<property name="hibernate.cache.region.journal.factory">org.jboss.cache.pojo.jms.JMSCacheLoaderFactory</property>

<cache name="sample-app-cache" />

<cache name="com.dashboarding.common.domain.CodeLookup.types" 
timeout="1800" 
maxEntriesLocalHeap="8000"
overflowToDisk="false"
/>

3. 在Hibernate实体类中添加缓存注解

@Entity
@Cacheable
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY, region=”sample-app-cache”)
public class User(){
    //……
}

4. 配置Spring对Hibernate的二级缓存支持

<bean class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
  <property name="dataSource" ref="dataSource"/>
  <property name="mappingResources">
    <list>
      <value>com/dashboarding/dao/hbm/workflow/Workflow.hbm.xml</value>
      <value>com/dashboarding/dao/hbm/workflow/Task.hbm.xml</value>
    </list>
  </property>
  <property name="hibernateProperties">
    <props>
      <prop key="hibernate.dialect">${hibernate.dialect}</prop>
      <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
      <prop key="hibernate.cache.use_second_level_cache">true</prop>
      <prop key="hibernate.cache.region.factory_class">
        org.hibernate.cache.ehcache.EhCacheRegionFactory
      </prop>
    </props>
  </property>
</bean>

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
  <property name="cacheManager" ref="ehcache"/>
</bean>

<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
  <property name="configLocation" value="classpath:ehcache.xml"/>
  <property name="shared" value="true"/>
</bean>

示例1: Hibernate + Ehcache

下面我们通过一个示例来说明如何在Hibernate中使用Ehcache。

步骤1: 启用二级缓存

我们需要在 hibernate.cfg.xml 的属性中将 use_second_level_cache 设置为 true,将 region.factory_class 设置为 EhCacheRegionFactory。

<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

步骤2: 配置缓存区域和策略

每个缓存区域都必须指定一个唯一的名称和缓存策略。

<!-- Ehcache configuration -->
<cache name="com.sample.app.Employee" maxElementsInMemory="100"
eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" />

<cache name="com.sample.app.Department" maxElementsInMemory="100"
eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" />

步骤3: 在实体类上加上缓存注解

在实体类上添加 Hibernate 的缓存注解

@Entity
@Cacheable
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY, region=”com.sample.app.Employee”)
public class Employee{
    //……
}

步骤4: 读取缓存中的数据

SessionFactory sessionFactory; 

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

Criteria criteria = session.createCriteria(Employee.class);
criteria.add(Restrictions.eq("id", id));
criteria.setCacheable(true);  
List<Employee> employees = criteria.list();

tx.commit();
session.close();

示例2: Spring + Hibernate + Ehcache

下面我们通过一个示例来说明如何在Spring和Hibernate中使用Ehcache。

步骤1: 配置Spring对Hibernate的二级缓存支持

配置Spring对Hibernate的二级缓存支持,在Spring配置文件中添加以下内容。

<bean class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
  ……
</bean>

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
  <property name="cacheManager" ref="ehcache"/>
</bean>

<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
  <property name="configLocation" value="classpath:ehcache.xml"/>
  <property name="shared" value="true"/>
</bean>

步骤2: 启用二级缓存

配置文件中开启二级缓存。

<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>

步骤3: 配置Session工厂中的二级缓存

在 Session 工厂中配置 Ehcache 缓存。

<property name="hibernateProperties">
  ……
  <prop key="hibernate.cache.use_second_level_cache">true</prop>
  <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
</property>

步骤4: 在实体类上加上缓存注解

在实体类上添加 Hibernate 的缓存注解

@Entity
@Cacheable
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY, region=”com.sample.app.Employee”)
public class Employee{
    //……
}

步骤5: 读取缓存中的数据

@Autowired
SessionFactory sessionFactory;

public Employee getEmployeeById(int empId) {
    Session session = sessionFactory.getCurrentSession();
    Criteria criteria = session.createCriteria(Employee.class);
    criteria.add(Restrictions.eq("id", empId));
    criteria.setCacheable(true);
    Employee emp = (Employee)criteria.uniqueResult();
    return emp;
}

在Spring和Hibernate中启动二级缓存非常简单。只需要简单的配置Spring和Hibernate,就可以提高系统在数据库查询方面的性能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring 整合 Hibernate 时启用二级缓存实例详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • springBoot中的properties配置解析

    在Spring Boot中,可以使用properties文件来配置应用程序的属性。这些属性可以用于配置数据源、日志、缓存、安全等方面。本文将详细讲解Spring Boot中的properties配置解析,包括如何定义属性、如何使用属性、如何覆盖属性等。 定义属性 在Spring Boot中,可以使用application.properties或applica…

    Java 2023年5月15日
    00
  • java中的session对象及其常用方法小结

    下面我将为你详细讲解“java中的session对象及其常用方法小结”的攻略。 Session对象是什么? Session是Servlet技术中的一个概念,用来存储客户端与服务器之间的交互信息。在Web开发中,服务器为每个访问它的客户端创建一个Session对象,用于存储客户端的一些状态信息。Session对象主要用于在多个请求之间存储客户端的数据,以便与客…

    Java 2023年6月15日
    00
  • Java常用工具类—集合排序

    下面是Java常用工具类—集合排序的完整攻略: 一、集合排序的介绍 集合是Java中非常重要的一种数据结构,它可以存储多个相同类型的对象。集合中的元素是没有固定顺序的,而如果我们需要按照一定的规则对集合中的元素进行排序,那么就需要使用集合排序的功能。 集合排序可以对一个集合中的元素按照升序或降序进行排序。Java中提供了很多集合排序的方式,如排序工具类、实现…

    Java 2023年5月26日
    00
  • Spring Boot中使用Spring MVC的示例解析

    Spring Boot中使用Spring MVC的示例解析 在开始使用Spring MVC之前,我们需要先安装并配置好Spring Boot和Spring MVC。安装时我们可以使用Spring官方提供的脚手架工具spring initilizr,也可以直接在IDE中创建Spring Boot项目并选择其中包含Spring MVC的依赖。 安装完毕之后,我们…

    Java 2023年6月15日
    00
  • Java获取指定字符串出现次数的方法

    Java获取指定字符串出现次数的方法 基本思路 要想获取指定字符串出现的次数,基本思路是使用String类中的方法来处理字符串,并利用循环的方式对整个字符串进行遍历,统计指定字符串出现的次数。 示例一 以下是一个基本的Java代码段,可以用于计算一个字符串中指定的子串出现的次数: public static int countOccurrences(Stri…

    Java 2023年5月27日
    00
  • Java基础之练习打印三角形

    下面是Java基础之练习打印三角形的完整攻略。 1.题目简介 题目要求在控制台上打印指定行数的三角形,具体形状如下: * ** *** **** ***** 2.解题思路 题目要求打印三角形,很容易想到使用循环结构,可以使用嵌套循环打印出指定行数的三角形。外层循环控制行数,内层循环利用嵌套控制打印“*”的数量。 3.代码实现 Java代码实现如下: publ…

    Java 2023年5月26日
    00
  • Android学习笔记45之gson解析json

    Android学习笔记45之gson解析json 简介 Google推出的Gson是一个使用Java语言实现的Json解析库,可以将Json字符串自动解析成Java对象,或者将Java对象转成Json字符串。在Android开发中,使用Gson解析Json数据是非常常见的操作。本文将介绍Gson解析Json的完整攻略。 配置Gson库 在项目的build.g…

    Java 2023年5月26日
    00
  • java实现上传文件到oss(阿里云)功能示例

    下面我会详细讲解Java实现上传文件到OSS(阿里云)功能的完整攻略。 1. 了解OSS OSS(Object Storage Service)是阿里云提供的海量、安全、低成本、高可靠的云存储服务。它是面向Internet应用设计的分布式存储服务,支持RESTful API,可以在任何时间、任何地点、任何互联网设备上进行上传、下载、管理和分享数据。 2. J…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部