使用Spring Cache优化数据库访问

使用Spring Cache优化数据库访问

在这篇博客中,我们将学习如何使用Spring Cache来优化数据库访问,提高系统性能。我们将创建一个简单的图书管理应用作为示例,并演示如何通过缓存减少对数据库的频繁查询。

1. 项目结构

首先,我们看一下项目的基本结构:

lfsun-study-cacheable
|-- src
|   |-- main
|       |-- java
|           |-- com.lfsun.cacheable
|               |-- controller
|                   |-- BookController.java
|               |-- dao
|                   |-- BookRepository.java
|               |-- entity
|                   |-- Book.java
|               |-- service
|                   |-- BookService.java
|                   |-- impl
|                       |-- BookServiceImpl.java
|               |-- LfsunStudyCacheableApplication.java
|       |-- resources
|           |-- application.properties
|-- pom.xml

2. 项目依赖

我们使用了Spring Boot和Spring Data JPA来简化项目配置。以下是主要的Maven依赖:

<!-- Spring Boot Starter -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId>
</dependency><!-- Spring Boot Starter Test -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency><!-- Spring Boot Starter Web -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><!-- Spring Boot Starter Data JPA -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency><!-- Lombok for easy POJOs -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency><!-- MySQL Connector -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version>
</dependency>

3. 数据库配置

配置MySQL数据库连接信息和Hibernate方言:

spring.datasource.url=jdbc:mysql://localhost:3306/lfsun_study
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

4. 实体类

定义一个简单的实体类Book,用于表示图书信息:

@Entity
@Data
@Table(name = "cacheable_book")
public class Book implements Serializable {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String title;private String author;
}

5. 数据访问层

创建一个JPA Repository接口 BookRepository,用于数据库交互:

public interface BookRepository extends JpaRepository<Book, Long> {Book findByTitle(String title);void deleteByTitle(String title);
}

6. 服务层

实现一个 BookService 接口,并创建具体的服务实现 BookServiceImpl。在服务实现中,使用Spring Cache注解来优化数据库访问:

@Service
@AllArgsConstructor
public class BookServiceImpl implements BookService {private final BookRepository bookRepository;@Override@Cacheable(value = "books", key = "#title")public Book getByTitle(String title) {System.out.println("Getting book from database for title: " + title);return bookRepository.findByTitle(title);}@Override@CachePut(value = "books", key = "#result.title")public Book save(Book book) {System.out.println("Saving book to database: " + book.getTitle());return bookRepository.save(book);}@Override@Transactional@CacheEvict(value = "books", key = "#title")public void deleteByTitle(String title) {System.out.println("Deleting book from database for title: " + title);bookRepository.deleteByTitle(title);}
}

7. 控制器层

创建REST控制器 BookController 处理图书的获取、保存和删除操作:

@RestController
@RequestMapping("/books")
@AllArgsConstructor
public class BookController {private final BookService bookService;@GetMapping("/{title}")public Book getBookByTitle(@PathVariable String title) {return bookService.getByTitle(title);}@PostMappingpublic Book saveBook(@RequestBody Book book) {return bookService.save(book);}@PostMapping("/delete/{title}")public ResponseEntity<String> deleteBookByTitle(@PathVariable String title) {bookService.deleteByTitle(title);return new ResponseEntity<>("Book deleted successfully", HttpStatus.OK);}
}

8. 主应用程序类

在主应用程序类 LfsunStudyCacheableApplication 上启用Spring缓存:

@SpringBootApplication
@EnableCaching
public class LfsunStudyCacheableApplication {public static void main(String[] args) {SpringApplication.run(LfsunStudyCacheableApplication.class, args);}
}

测试

1. 新增图书

POST http://localhost:8888/books
Content-Type: application/json{"title": "JavaStudy777","author": "冷风扇","isbn": "1234567890"
}

2. 获取图书信息

# GET请求
GET http://localhost:8888/books/JavaStudy777

3. 删除图书

# POST请求
POST http://localhost:8888/books/delete/JavaStudy777

image.png

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

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

相关文章

全网最强的Spring源码入门教程(包含IOC、AOP、事务、MVC)

一. ioc 1.1 bd的收集 1.1.1 基于xml 入口 AbstracApplicationtContext.refresh -> AbstracApplicationtContext.obtainFreshBeanFactory() -> 调用到子类 AbstractRefreshableApplicationContext.loadBeanDefinitions() -> AbstractXmlApplicationContext.loadBeanDe…

CAN通信的基本原理与实现方法

一. CAN协议概念 1.1 CAN 协议简介 CAN 是控制器局域网络 (Controller Area Network) 的简称&#xff0c;它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的&#xff0c;并最终成为国际标准(ISO11519以及ISO11898),是国际上应用最广泛的现场总线之一。差异点如下&…

macOS 老版本系统恢复中出现“MacBook Pro无法与恢复服务器取得联系”

macOS 老版本系统恢复中出现“MacBook Pro无法与恢复服务器取得联系” 网络问题系统时间问题镜像索引问题 网络问题 系统时间问题 镜像索引问题 恢复模式的 “实用工具 > 系统终端” 里执行如下 nvram IASUCatalogURLhttps://swscan.apple.com/content/catalogs/others/i…

Python 面向对象之反射

Python 面向对象之反射 【一】概念 反射是指通过对象的属性名或者方法名来获取对象的属性或调用方法的能力反射还指的是在程序额运行过程中可以动态获取对象的信息(属性和方法) 【二】四个内置函数 又叫做反射函数 万物皆对象&#xff08;整数、字符串、函数、模块、类等等…

Unity中Shader序列帧动画(总结篇)

文章目录 前言一、半透明混合自定义调整1、属性面板2、SubShader中3、在片元着色器(可选)3、根据纹理情况自己调节 二、适配Build In Render Pipeline三、最终代码 前言 在前几篇文章中&#xff0c;我们依次解决了实现Shader序列帧动画所遇到的问题。 Unity中Shader序列图动画…

欧系数学一眼假系列7.“欧拉常数”是弥天大谎

数学界一直在干一件令人恶心的丑事&#xff1a;明明我求的是Σ1/708249541360742487&#xff0c;它给的答案却是ln7082495413607424870.5772156649(欧拉常数&#xff0c;通常以C表示)&#xff0c;门外汉皆以为Σ1/n→∞是正经结论&#xff0c;全然不知它无关Σ1/n&#xff0c;而…

Geoserver扩展发布MySQL视图功能

Geoserver中并不自带mysql数据发布功能&#xff0c;需要扩展外部插件。 1、示例以geoserver-2.20.5版本进行演示&#xff0c;所以MySQL插件需要到该版本对应的“Extensions”标题下查找&#xff0c;下载地址&#xff1a;GeoServer&#xff0c;详见下图 2、选择MySQL进入下载页…

解决:TypeError: ‘tuple’ object does not support item assignment

解决&#xff1a;TypeError: ‘tuple’ object does not support item assignment 文章目录 解决&#xff1a;TypeError: tuple object does not support item assignment背景报错问题报错翻译报错位置代码报错原因解决方法方法一&#xff1a;方法二&#xff1a;今天的分享就到…

【KD】知识蒸馏(knowledge distillation)简单介绍

最近学到了知识蒸馏的相关知识&#xff0c;来简单总结一下૮꒰ ˶• ༝ •˶꒱ა。 知识蒸馏 知识蒸馏&#xff0c;是一种模型压缩的手段。通过训练学生模仿教师的行为&#xff0c;将嵌入在大的教师模型中的知识迁移到小的学生模型。 例如&#xff0c;TinyBERT(Jiao et al.,2…

stm32学习笔记:TIM-输出比较

四部分讲解内容&#xff0c;本文是第二部分 输出比较主要用于PWM波形的控制电机&#xff08;驱动电机的必要条件&#xff09; 1、定时器基本定时&#xff0c;定一个时间&#xff0c;然后让定时器每隔一段时间产生一个中断&#xff0c;来实现每隔一个固定时间执行一段程序的目…

【C语言】Linux实现高并发处理的过程

一、实现高并发的几种策略 C语言本身并没有内建的多线程支持&#xff08;新版C语言支持&#xff0c;但用得不多&#xff09;&#xff0c;但是在多数操作系统中&#xff0c;可以使用库来实现多线程编程。例如&#xff0c;在POSIX兼容系统上&#xff0c;可以使用 pthreads 库来创…

海外分支访问国内服务器系统慢怎么办?

在全球业务不断扩张的今天&#xff0c;企业面临着海外分支访问国内总部服务器系统慢的问题。为了解决这一挑战&#xff0c;我们引入了lxway全球系统专网产品&#xff0c;为企业提供高效、安全的全球网络连接方案。通过解析技术瓶颈和专网的优势&#xff0c;本文将揭示如何借助先…