SpringBoot和Hibernate——如何提高数据库性能

摘要:本文由葡萄城技术团队发布。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。

前言

在软件开发领域,性能是重中之重。无论您是构建小型 Web 应用程序还是大型企业系统,用户都期望快速且响应迅速的软件。作为开发人员,我们不断努力优化我们的代码并减少那些可怕的加载时间。

影响应用程序性能的关键因素之一是数据库交互。数据库是许多应用程序的支柱,有效存储和检索数据至关重要。这就是流行的对象关系映射 (ORM) 框架 Hibernate 发挥作用的地方。Hibernate 通过将数据库表映射到 Java 对象来简化与数据库交互的过程。它是一个强大的工具,但像任何工具一样,它需要明智地使用。

在本文中,小编将带您了解我使用 Hibernate 二级缓存在 Spring Boot 应用程序中提高数据库性能的经验。我们将深入研究缓存策略、配置设置和最佳实践,以提高应用程序的响应能力。在本次旅程结束时,您将拥有增强数据库性能的知识和工具。

缓存

像 Hibernate 这样的 ORM 框架通过将数据库表映射到 Java 对象,提供了一种使用数据库的便捷方法。它们透明地缓存数据。缓存是指将经常访问的数据存储在内存中,从而减少重复查询数据库的需要。这可以带来显着的性能提升,尤其是处理大型对象图时。

Hibernate 中的二级缓存是在会话工厂级别运行的共享缓存,使其可以跨多个会话访问。它用于存储和管理实体数据,以便可以有效地检索实体数据,而无需重复访问数据库。

二级缓存说明:

1.一级缓存:在Hibernate中, 每个会话(数据库事务)都有自己的一级缓存。此缓存用于存储和管理在该会话中检索或操作的实体实例。一级缓存是隔离的,并且与特定的会话绑定。当会话关闭时,一级缓存被丢弃。
2.二级缓存:相比之下,二级缓存是在从同一会话工厂创建的所有会话之间共享的全局缓存。它在更高的水平上运行,允许 跨不同会话和事务缓存和检索的数据。
在这里插入图片描述

二级缓存的工作原理:

当通过 ID(主键)查找实体实例并为该实体启用二级缓存时,Hibernate 将执行以下步骤:

检查一级缓存: Hibernate 首先检查与当前会话关联的一级缓存(会话缓存)。如果实体实例已经存在于一级缓存中,则立即返回,避免数据库查询。
检查二级缓存:如果在一级缓存中没有找到实体,Hibernate 将检查二级缓存。二级缓存在全局级别存储实体数据,使其可供所有会话访问。
从数据库加载:如果在一级缓存或二级缓存中都没有找到实体数据,Hibernate就会继续从数据库加载数据。一旦从数据库中获取数据,Hibernate 就会组装一个实体实例并将其存储在当前会话的一级缓存中。
后续调用的缓存:一旦实体实例位于一级缓存(会话缓存)中,同一会话中的所有后续调用都会返回该实体实例,而无需额外的数据库查询。另外,如果实体数据是从数据库中获取的,它也可以存储在二级缓存中以供其他会话将来使用。
在这里插入图片描述

如何使用 Spring Boot 使用二级缓存

第一步:设置 Spring Boot 项目
您可以使用 Spring Initializr 或您喜欢的 IDE 创建新的 Spring Boot 项目。确保至少选择 Spring Boot、Spring Data JPA、Hibernate、Ehcache 和 Web 所需的依赖项。

第二步:配置Ehcache
ehcache.xml在该目录下创建Ehcache配置文件src/main/resources。下面是一个简单的例子:

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="http://www.ehcache.org/ehcache.xsd"updateCheck="true" monitoring="autodetect" dynamicConfig="true">
<defaultCache maxEntriesLocalHeap="10000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200" overflowToDisk="false" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" /><!-- Define specific cache regions for entities here -->
</ehcache>
  • timeToIdleSeconds:条目在被视为过期并删除之前可以在缓存中空闲(未访问)的最长时间(以秒为单位) 。
  • maxEntriesLocalHeap:本地堆内存中存储的缓存条目的最大数量。当达到此限制时,旧条目将被逐出,以便为新条目腾出空间。
  • timeToLiveSeconds:条目在被视为过期并被删除之前可以在缓存中存在的最长时间(以秒为单位),无论是否已被访问。
  • diskPersistent:如果true,磁盘存储是持久的,这意味着即使在系统重新启动后条目也会保留。如果false,条目将在系统重新启动时丢失。

第三步:实体类
创建一个要缓存的实体。例如,一个Product实体:

@Entity
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Product {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;private BigDecimal price;// Constructors, getters, and setters
}

第四步:存储库接口

import org.springframework.data.jpa.repository.JpaRepository;
public interface ProductRepository extends JpaRepository<Product, Long> {// Define custom query methods if needed
}

第五步:服务层

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ProductService {@Autowiredprivate ProductRepository productRepository;public Product getProductById(Long productId) {// The following query result will be cached if caching is configured properlyreturn productRepository.findById(productId).orElse(null);}// Other service methods
}

第六步:配置应用程序属性
确保application.properties 您具有启用缓存所需的属性并指定 Ehcache 配置:

# Enable Hibernate second-level cache
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
# Specify the region factory class for Ehcache
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
# Ehcache configuration file location
spring.cache.ehcache.config=classpath:ehcache.xml

当调用 时productRepository.findById(productId),ProductServiceHibernate 和 Spring Data JPA 会处理会话和缓存管理。发生的情况如下:

Product如果在二级缓存中找到了所请求的实体(例如),则从缓存中返回该实体,并且不打开任何数据库会话。
如果在缓存中未找到实体,Spring Data JPA 将自动打开数据库会话。执行数据库查询以检索实体。
检索到的实体存储在二级缓存中并返回给您的服务方法。

关于SpringBoot的更多资料还可以点击这里。

缓存集合(一对多和多对多关系)

集合缓存允许您缓存关联实体的整个集合。这些集合可以是域模型的一部分,例如实体之间的一对多或多对多关系。

集合缓存很有价值在处理频繁加载的实体之间的关联时以及缓存可以显着提高性能的地方。当您启用集合缓存时,Hibernate 会缓存与实体关联的整个集合,例如列表或集。

当 Hibernate 缓存集合时,它不会缓存整个实体集合,而是缓存集合中包含的实体的 ID。

与缓存整个实体集合相比,仅缓存 ID可以减少内存使用量。
当集合更新时,只需使缓存中的相关ID失效,而不是整个集合。这最大限度地减少了缓存失效的开销。

@Entity
@Cacheable
public class Category {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;
@OneToMany(mappedBy = "category")@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)private List<Product> products;// Getters and setters
}
@Entity
@Cacheable
public class Product {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;@ManyToOneprivate Category category;// Getters and setters
}
  • Hibernate 创建一个名为
    的缓存区域com.example.model.Category.products。该区域专门用于存储与类别关联的产品的缓存集合。
  • 假设我们有一个 ID 为 1 的类别,其中包含 ID 为 101、102 和 103 的产品。Hibernate
    使用键值对将此数据存储在缓存中。
  • 键值对可能看起来像"Category:1:products — [101, 102, 103]"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/101511.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单目标应用:遗传算法(Genetic Algorithm,GA)求解微电网优化MATLAB

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、遗传算法GA 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;起源于对生物系统所进行的计算机模拟研究&#xff0c;是一种随机全局搜索…

【Java 进阶篇】JavaScript 数据类型详解

JavaScript是一种弱类型脚本语言&#xff0c;具有动态类型。这意味着JavaScript中的变量可以容纳不同类型的数据&#xff0c;并且它们的类型可以在运行时更改。在本文中&#xff0c;我们将深入探讨JavaScript中的数据类型&#xff0c;包括原始数据类型和引用数据类型&#xff0…

安科瑞ARB5系列弧光保护装置,智能电弧光保护,保障用电安全

安科瑞虞佳豪壹捌柒陆壹伍玖玖零玖叁 什么是弧光 电弧是放电过程中发生的一种现象&#xff0c;当两点之间的电压超过其工频绝缘强度极限时就会发生。当适当的条件出现时&#xff0c;一个携带着电流的等离子产生&#xff0c;直到电源侧的保护设备断开才会消失。空气在通常条件…

【ARM CoreLink 系列 6 -- DMC-400控制器简介】

文章目录 1.1 DMC-400 简介1.1.1 DFI&#xff08;DDR PHY Interface&#xff09;1.1.2 DFI 接口组1.1.3 DMC-400 兼容协议1.1.4 DMC-400 特性1.1.5 DMC-400 Interface 1.1 DMC-400 简介 DMC-400是一个由ARM开发、测试和授权的动态内存控制器&#xff0c;同时 DMC-400也是一个符…

git 回滚到指定版本

第一步&#xff1a;找到指定的需要回滚的版本的版本号 项目终端输入命令git log --oneline 第二步&#xff1a;使用git命令回滚到指定的版本 git reset --hard 版本号 第三步&#xff1a;此时再推到远程仓库用git push 会报错&#xff0c;需要用git push -f强推上去才可以哦

Swagger-go学习笔记

目录 Swagger的作用背景Swagger介绍 Swagger的基本使用1. 使用步骤2. 添加注释3. 生成接口文档数据4. 引入gin-swagger5. 测试结果6. 使用Token Swagger-go的中文文档通用API信息API操作MIME类型参数类型数据类型 Swagger的作用 背景 在传统的前后端分离的项目中&#xff0c;…

vue3组件的通信方式

一、vue3组件通信方式 通信仓库地址:vue3_communication: 当前仓库为贾成豪老师使用组件通信案例 不管是vue2还是vue3,组件通信方式很重要,不管是项目还是面试都是经常用到的知识点。 比如:vue2组件通信方式 props:可以实现父子组件、子父组件、甚至兄弟组件通信 自定义事件:可…

C语言自定义类型_枚举联合(3)

目录 枚举 什么是枚举类型&#xff1f; 枚举的声明 枚举的定义 枚举的优点 枚举的使用 联合&#xff08;共用体&#xff09; 什么是联合呢&#xff1f; 联合类型的定义 联合的特点 联合使用 联合大小的计算 联合的应用 今天接着我们来结束自定义类型。&#x1f19…

Flink之Watermark源码解析

1. WaterMark源码分析 在Flink官网中介绍watermark和数据是异步处理的,通过分析源码得知这个说法不够准确或者说不够详细,这个异步处理要分为两种情况: watermark源头watermark下游 这两种情况的处理方式并不相同,在watermark的源头确实是异步处理的,但是在下游只是做的判断,这…

TensorFlow学习:在web前端如何使用Keras 模型

前言 在上篇文章 TensorFlow学习&#xff1a;使用官方模型进行图像分类、使用自己的数据对模型进行微调中我们学习了如何使用官方模型&#xff0c;以及使用自己的数据微调模型。 但是吧&#xff0c;代码一直是跑在Python里&#xff0c;而我本身是做前端开发的。我是很想让它在…

es elasticsearch 基础

es https://www.elastic.co/guide/en/elasticsearch/reference/6.8/getting-started.html 倒排索引&#xff1a; 正排–>从目录到文章内容 倒排–>内容到目录文章标题 if we dont need full text search ,we dont need to create 倒排 using text type 分词&#xff1a…

C语言-贪吃蛇 1.输入控制ncurse

一、为什么要用nurse C语言中的gets()、scanf()、getchar()等函数是在用户输入后需要按下Enter键才能执行代码&#xff0c;而贪吃蛇要求按下按键后立即对蛇的方向进行操作&#xff0c;所以根据贪吃蛇功能的需求引入ncurse&#xff0c;让用户输入后就能让蛇进行对应的行动。 二、…

10.本项目的简单介绍及所用工具

本项目的简单介绍及所用工具 本项目的层次架构适合初学者或者有一些基础的同学&#xff0c;项目整体简单明了&#xff0c;有着非常严谨的逻辑思维&#xff0c;并且在前面文章中也讲了一些项目中所需要的软件安装配置以及一些前置的在本项目中所需要的java基础知识。 项目名称 …

8路高速光栅尺磁栅尺编码器4倍频计数转Modbus TCP网络模块 YL99-RJ45

特点&#xff1a; ● 光栅尺磁栅尺解码转换成标准Modbus TCP协议 ● 高速光栅尺磁栅尺4倍频计数&#xff0c;频率可达5MHz ● 模块可以输出5V的电源给光栅尺或传感器供电 ● 支持8个光栅尺同时计数&#xff0c;可识别正反转 ● 可以设置作为16路独立DI高速计数器 ● 可网…

智慧办公数据可视化大屏设计(数据可视化)、大数据、数据大屏、办公数据大屏、办公数据

本次分享的作品是用软件Axure8.0&#xff08;兼容9和10&#xff09;制作的智慧办公数据进行的可视化大屏设计&#xff0c;主要是针对办公的综合数据、工位数据、会议室数据、访客数据、能耗数据以及设备智控数据进行可视化数据分析。 1、综合分析:对办公室的整体数据、空气质量…

JVM第一讲:JVM相关知识体系详解+面试(P6熟练 P7精通)

JVM相关知识体系详解面试(P6熟练 P7精通) 面试时常常被面试官问到JVM相关的问题。本系列将给大家构建JVM核心知识点全局知识体系&#xff0c;本文是JVM第一讲&#xff0c;JVM相关知识体系详解和相关面试题梳理。 文章目录 JVM相关知识体系详解面试(P6熟练 P7精通)1、JVM学习建议…

设计模式 - 行为型考点模式:责任链模式(概述 | 案例实现 | 优缺点 | 使用场景)

目录 一、行为型模式 1.1、责任链模式 1.1.1、概述 1.1.2、案例实现 1.1.3、优缺点 1.1.4、使用场景 一、行为型模式 1.1、责任链模式 1.1.1、概述 为了避免请求发送者和多个请求处理者耦合在一起&#xff0c;就将所有请求处理者通过前一个对象记住下一个对象的引用的方…

联邦学习综述二

联邦学习漫画 联邦学习漫画链接: https://federated.withgoogle.com/ Federated Analytics: Collaborative Data Science without Data Collection 博客链接: https://blog.research.google/2020/05/federated-analytics-collaborative-data.html 本篇博客介绍了联邦分析&a…

Filebeat、metricbeat、kafka

kibana机子上安装filebeat&#xff08;因为有nginx&#xff09; 上传filebrat包 在es概览查看 上传metricbeat 排错 tailf !$ Kibana-Vlsualize查看 kafka(卡夫卡) kafka是一个分布式的消息发布—订阅系统&#xff08;kafka其实是消息队列&#xff09;消息队列中间件 Kafka的…

Pycharm远程debug代码,一直进入remote_sources

最近debug发现代码一直跳转到 AppData\Local\JetBrains\PyCharm2022.2\remote_sources\xxx这样的目录下&#xff0c;查找百度也没有找到解决的方法。 最后发现&#xff0c;在Run的配置这&#xff0c;有一个Path mappings是空的&#xff0c;把这里的映射填成本地项目和远程项目…