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——如何提高数据库性能
摘要:本文由葡萄城技术团队发布。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 在软件开发领域,性能是重中之重。无论您是构建小型 Web 应用程序还是大型企业系统…...
五分钟Win11安装安卓(Android)子系统
十分钟,完成win11安装安卓子系统 Step1、地区设置为美国 Wini 进入设置页面,选择时间和语言-语言和区域- 区域-美国 Step2 安装 Windows Subsystem for Android™ with Amazon Appstore 访问如下连接,install即可 安卓子系统 Step3 安…...
基于LSTM-Adaboost的电力负荷预测的MATLAB程序
微❤关注“电气仔推送”获得资料(专享优惠) 主要内容: LSTM-AdaBoost负荷预测模型先通过 AdaBoost集成算法串行训练多个基学习器并计算每个基学习 器的权重系数,接着将各个基学习器的预测结果进行线性组合,生成最终的预测结果。代码中的LST…...
GLTF纹理贴图工具让模型更逼真
1、如何制作逼真的三维模型? 要使三维模型看起来更加逼真,可以考虑以下几个方面: 高质量纹理:使用高分辨率的纹理贴图可以增强模型的细节和真实感。选择适合模型的高质量纹理图像,并确保纹理映射到模型上的UV坐标正确…...
HttpServletResponse对象
1.介绍 在Servlet API中,定义了一个HttpServletResponse接口,它继承自ServletResponse接口,专门用来封装HTTP响应消息。由于HTTP响应消息分为状态行、响应消息头、消息体三部分,因此,在HttpServletResponse接口中定义…...
在SSL中进行交叉熵学习的步骤
在半监督学习(Semi-Supervised Learning,SSL)中进行交叉熵学习通常包括以下步骤: 准备标注数据和未标注数据 首先,你需要准备带有标签的标注数据和没有标签的未标注数据。标注数据通常是在任务中手动标记的ÿ…...
10月TIOBE榜Java跌出前三!要不我转回C#吧
前言 Java又要完了,又要没了,你没看错,10月编程语言榜单出炉,Java跌出前三,并且即将被C#超越,很多资深人士预测只需两个月,Java就会跌出前五。 看到这样的文章,作为一名Java工程师我…...
优盘中毒了怎么办?资料如何恢复
在现代社会中,优盘成为我们日常生活与工作中必备的便携式存储设备。然而,正是由于其便携性,优盘也成为病毒感染的主要目标之一。本篇文章将帮助读者了解如何应对优盘中毒的情况,以及如何恢复因病毒感染丢失的资料。 ▶优盘为什么…...
如何查看端口占用(windows,linux,mac)
如何查看端口占用,各平台 一、背景 如何查看端口占用?网上很多,但大多直接丢出命令,没有任何解释关于如何查看命令的输出 所谓 “查端口占用”,即查看某个端口是否被某个程序占用,如果有,被哪…...
Photoshop与Web技术完美融合,Web版Photoshop已正式登场
通过WebAssembly Emscripten、Web Components Lit、Service Workers Workbox以及对新的Web API的支持,Chrome和Adobe之间的合作使得将Photoshop桌面应用程序引入Web成为了一项重大的里程碑。现在,您可以在浏览器上使用高度复杂和图形密集的软件&#…...
易点易动:提升企业固定资产管理效率的完美解决方案
在现代商业环境中,企业的固定资产管理是一项关键任务。高效的固定资产管理可以帮助企业降低成本、提高生产力,并确保资产的最佳利用。然而,传统的资产管理方法常常繁琐、低效,导致信息不准确、流程混乱。为了解决这一问题…...
SRE实战:如何低成本推进风险治理?稳定性与架构优化的3个策略
一分钟精华速览 SRE 团队每天面临着不可控的各类风险和重复发生的琐事,故障时疲于奔命忙于救火。作为技术管理者,你一直担心这些琐事会像滚雪球一样,越来越多地、无止尽地消耗你的团队,进而思考如何系统性地枚举、掌控这些风险&a…...
APK大小缩小65%,内存减少70%:如何优化Android App
APK大小缩小65%,内存减少70%:如何优化Android App 我们一直在努力为我们的Android应用程序构建MVP产品。在开发MVP产品后,我们发现需要进行应用程序优化以提高性能。经过分析,我们发现了以下可以改进的应用…...
传统工厂如何搭建蒸汽流量远程无线抄表系统?
一、应用背景 2021年国务院政府工作报告中指出,扎实做好碳达峰、碳中和各项工作,制定2030年前碳排放达峰行动方案,优化产业结构和能源结构,特别是近期煤炭价格上涨导致蒸汽价格大幅上涨,节能减排显得更加重要…...
睿趣科技:抖音店铺怎么取名受欢迎
抖音作为国内最大的短视频平台,其商业价值不容忽视。许多商家和创作者都在抖音上开设了自己的店铺,而一个富有创意和吸引力的店铺名字,往往能带来更多的客流量。那么,如何为抖音店铺取个好名字呢?以下是一些有用的建议。 明确定位…...
面试经典 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认证是亚马逊针对卖家销售儿童用品的一个认证,如果提交CPC证书到亚马逊,亚马逊审核一直不通过,我们可以从几个方面入手来查下什么原因,是资料本身的原因?是否提供的资料合规&…...
项目_数据可视化| 折线图.散点图.随机漫步
安装matplotlib 在正式开始编写程序之前,需要先安装pip、matplotlib模块,苹果系统的安装问题在之前的文章中有相关介绍内容,如果pycharm运行模块报错,可以再次检查是否版本兼容问题。 绘制折线图 调用subplot(&#x…...
Android 项目增加 res配置
main.res.srcDirs "src/main/res_test" build->android->sourceSets...
MySQL数据库的MVCC详解
在MySQL的事务隔离锁机制中,MVCC是一个非常重要的概念,学会MVCC可以更好地理解MySQL如何实现各种隔离级别。 首先,大概地介绍一下mysql的事务隔离级别: 1、读未提交(Read Uncommited):指的是&…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
