当前位置: 首页 > news >正文

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]"

相关文章:

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

摘要&#xff1a;本文由葡萄城技术团队发布。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 在软件开发领域&#xff0c;性能是重中之重。无论您是构建小型 Web 应用程序还是大型企业系统…...

五分钟Win11安装安卓(Android)子系统

十分钟&#xff0c;完成win11安装安卓子系统 Step1、地区设置为美国 Wini 进入设置页面&#xff0c;选择时间和语言-语言和区域- 区域-美国 Step2 安装 Windows Subsystem for Android™ with Amazon Appstore 访问如下连接&#xff0c;install即可 安卓子系统 Step3 安…...

基于LSTM-Adaboost的电力负荷预测的MATLAB程序

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 主要内容&#xff1a; LSTM-AdaBoost负荷预测模型先通过 AdaBoost集成算法串行训练多个基学习器并计算每个基学习 器的权重系数,接着将各个基学习器的预测结果进行线性组合,生成最终的预测结果。代码中的LST…...

GLTF纹理贴图工具让模型更逼真

1、如何制作逼真的三维模型&#xff1f; 要使三维模型看起来更加逼真&#xff0c;可以考虑以下几个方面&#xff1a; 高质量纹理&#xff1a;使用高分辨率的纹理贴图可以增强模型的细节和真实感。选择适合模型的高质量纹理图像&#xff0c;并确保纹理映射到模型上的UV坐标正确…...

HttpServletResponse对象

1.介绍 在Servlet API中&#xff0c;定义了一个HttpServletResponse接口&#xff0c;它继承自ServletResponse接口&#xff0c;专门用来封装HTTP响应消息。由于HTTP响应消息分为状态行、响应消息头、消息体三部分&#xff0c;因此&#xff0c;在HttpServletResponse接口中定义…...

在SSL中进行交叉熵学习的步骤

在半监督学习&#xff08;Semi-Supervised Learning&#xff0c;SSL&#xff09;中进行交叉熵学习通常包括以下步骤&#xff1a; 准备标注数据和未标注数据 首先&#xff0c;你需要准备带有标签的标注数据和没有标签的未标注数据。标注数据通常是在任务中手动标记的&#xff…...

10月TIOBE榜Java跌出前三!要不我转回C#吧

前言 Java又要完了&#xff0c;又要没了&#xff0c;你没看错&#xff0c;10月编程语言榜单出炉&#xff0c;Java跌出前三&#xff0c;并且即将被C#超越&#xff0c;很多资深人士预测只需两个月&#xff0c;Java就会跌出前五。 看到这样的文章&#xff0c;作为一名Java工程师我…...

优盘中毒了怎么办?资料如何恢复

在现代社会中&#xff0c;优盘成为我们日常生活与工作中必备的便携式存储设备。然而&#xff0c;正是由于其便携性&#xff0c;优盘也成为病毒感染的主要目标之一。本篇文章将帮助读者了解如何应对优盘中毒的情况&#xff0c;以及如何恢复因病毒感染丢失的资料。 ▶优盘为什么…...

如何查看端口占用(windows,linux,mac)

如何查看端口占用&#xff0c;各平台 一、背景 如何查看端口占用&#xff1f;网上很多&#xff0c;但大多直接丢出命令&#xff0c;没有任何解释关于如何查看命令的输出 所谓 “查端口占用”&#xff0c;即查看某个端口是否被某个程序占用&#xff0c;如果有&#xff0c;被哪…...

Photoshop与Web技术完美融合,Web版Photoshop已正式登场

通过WebAssembly Emscripten、Web Components Lit、Service Workers Workbox以及对新的Web API的支持&#xff0c;Chrome和Adobe之间的合作使得将Photoshop桌面应用程序引入Web成为了一项重大的里程碑。现在&#xff0c;您可以在浏览器上使用高度复杂和图形密集的软件&#…...

易点易动:提升企业固定资产管理效率的完美解决方案

在现代商业环境中&#xff0c;企业的固定资产管理是一项关键任务。高效的固定资产管理可以帮助企业降低成本、提高生产力&#xff0c;并确保资产的最佳利用。然而&#xff0c;传统的资产管理方法常常繁琐、低效&#xff0c;导致信息不准确、流程混乱。为了解决这一问题&#xf…...

SRE实战:如何低成本推进风险治理?稳定性与架构优化的3个策略

一分钟精华速览 SRE 团队每天面临着不可控的各类风险和重复发生的琐事&#xff0c;故障时疲于奔命忙于救火。作为技术管理者&#xff0c;你一直担心这些琐事会像滚雪球一样&#xff0c;越来越多地、无止尽地消耗你的团队&#xff0c;进而思考如何系统性地枚举、掌控这些风险&a…...

APK大小缩小65%,内存减少70%:如何优化Android App

APK大小缩小65&#xff05;&#xff0c;内存减少70&#xff05;&#xff1a;如何优化Android App 我们一直在努力为我们的Android应用程序构建MVP产品。在开发MVP产品后&#xff0c;我们发现需要进行应用程序优化以提高性能。经过分析&#xff0c;我们发现了以下可以改进的应用…...

传统工厂如何搭建蒸汽流量远程无线抄表系统?

一、应用背景 2021年国务院政府工作报告中指出&#xff0c;扎实做好碳达峰、碳中和各项工作&#xff0c;制定2030年前碳排放达峰行动方案&#xff0c;优化产业结构和能源结构&#xff0c;特别是近期煤炭价格上涨导致蒸汽价格大幅上涨&#xff0c;节能减排显得更加重要&#xf…...

睿趣科技:抖音店铺怎么取名受欢迎

抖音作为国内最大的短视频平台&#xff0c;其商业价值不容忽视。许多商家和创作者都在抖音上开设了自己的店铺&#xff0c;而一个富有创意和吸引力的店铺名字&#xff0c;往往能带来更多的客流量。那么&#xff0c;如何为抖音店铺取个好名字呢?以下是一些有用的建议。 明确定位…...

面试经典 150 题 22 —(数组 / 字符串)— 28. 找出字符串中第一个匹配项的下标

28. 找出字符串中第一个匹配项的下标 方法一 class Solution { public:int strStr(string haystack, string needle) {if(haystack.find(needle) string::npos){return -1;}return haystack.find(needle);} };方法二 class Solution { public:int strStr(string haystack, s…...

儿童产品亚马逊CPC认证审核不通过的原因解析

一、亚马逊CPC认证审核不通过的原因 CPC认证是亚马逊针对卖家销售儿童用品的一个认证&#xff0c;如果提交CPC证书到亚马逊&#xff0c;亚马逊审核一直不通过&#xff0c;我们可以从几个方面入手来查下什么原因&#xff0c;是资料本身的原因&#xff1f;是否提供的资料合规&…...

项目_数据可视化| 折线图.散点图.随机漫步

安装matplotlib 在正式开始编写程序之前&#xff0c;需要先安装pip、matplotlib模块&#xff0c;苹果系统的安装问题在之前的文章中有相关介绍内容&#xff0c;如果pycharm运行模块报错&#xff0c;可以再次检查是否版本兼容问题。 绘制折线图 调用subplot&#xff08;&#x…...

Android 项目增加 res配置

main.res.srcDirs "src/main/res_test" build->android->sourceSets...

MySQL数据库的MVCC详解

在MySQL的事务隔离锁机制中&#xff0c;MVCC是一个非常重要的概念&#xff0c;学会MVCC可以更好地理解MySQL如何实现各种隔离级别。 首先&#xff0c;大概地介绍一下mysql的事务隔离级别&#xff1a; 1、读未提交&#xff08;Read Uncommited&#xff09;&#xff1a;指的是&…...

AI:10-基于TensorFlow的玉米病害识别

玉米是世界上最重要的粮食作物之一,然而,玉米病害对其产量和质量造成了严重威胁。传统的病害识别方法通常依赖于人工观察和经验判断,效率低下且易受主观因素影响。近年来,基于深度学习的图像识别技术在农业领域取得了显著进展,为玉米病害的快速、准确识别提供了新的解决方…...

vue3前端开发系列 - electron开发桌面程序(2023-10月最新版)

文章目录 1. 说明2. 创建项目3. 创建文件夹electron3.1 编写脚本electron.js3.2 编写脚本proload.js 4. 修改package.json4.1 删除type4.2 修改scripts4.3 完整的配置如下 5. 修改App.vue6. 修改vite.config.ts7. 启动8. 打包安装9. 项目公开地址 1. 说明 本次安装使用的环境版…...

前端uniapp生成海报并保存相册

uiapp插件 目录 图片qrcode.vue源码完整版封装源码qrcodeSwiper.vue最后 图片 qrcode.vue源码完整版 <template><view class"qrcode"><div class"qrcode_swiper SourceHanSansSC-Normal"><!-- <cc-scroolCard :dataInfo"dat…...

0基础学习VR全景平台篇 第104篇:720全景后期软件安装

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 摄影进入数码时代&#xff0c;后期软件继承“暗房工艺”&#xff0c;成为摄影师表达内在情感的必备工具。 首先说明&#xff0c;全景摄影与平面摄影的一个显著的区别是全景图片需…...

CMakeLists编译前拷贝文件或目录

${CMAKE_CURRENT_BINARY_DIR} 编译工程目录 file(COPY python/ DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/python/ FILES_MATCHING PATTERN "*.exe") file(COPY python/Lib DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/python/) file(COPY python/Libs DESTINATION $…...

mysql面试题35:MySQL有关权限的表有哪些?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:MySQL有关权限的表有哪些? MySQL中与权限相关的表主要包括以下几个: user表:存储MySQL用户的基本信息,包括用户名、密码等。可以使用以下命令…...

ES6:什么是Symbol_

引言 在编程领域&#xff0c;我们经常听到关于"Symbol"的术语&#xff0c;但你知道它到底是什么吗&#xff1f;Symbol是一种基本数据类型&#xff0c;它在JavaScript中被引入&#xff0c;用于表示唯一的标识符。本文将介绍Symbol的概念、用途以及如何在代码中使用它…...

E. Li Hua and Array

Problem - E - Codeforces 思路&#xff1a;观察给定的函数&#xff0c;其实就是求与这个数互质的数的个数&#xff0c;即欧拉函数&#xff0c;我们发现一个数迭代欧拉函数不会很多&#xff0c;那么对于第一个操作来说我们可以直接暴力修改&#xff0c;而对于第二个操作来说&am…...

【项目】在线oj

1. 创建项目 创建maven项目。 引入依赖&#xff08;mysql connector和servlet&#xff09;&#xff1a; <dependencies><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><ar…...

第十章-输入输出系统

Ⅰ.锁 本质是互斥操作 原因&#xff1a;针对公共资源访问时&#xff0c;临界区若不加以互斥限制&#xff0c;可能导致执行过程中突然的中断导致出现异常。 1.互斥过程 设定互斥量M为二值信号量&#xff0c;0/1&#xff0c;P-&#xff0c;V&#xff0c;现有两个进程A、B共同…...