使用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