连接池是 Spring Boot 应用程序中一个至关重要的组成部分,原因有很多,主要与性能和资源管理相关。
以下是连接池不可或缺的原因:
- 高效的资源管理
连接成本高:为每个请求创建新的数据库连接不仅消耗资源,还浪费时间,因为这涉及到网络开销、身份验证和会话初始化。
重用连接:连接池维护一个可重复使用的预先建立的连接集合,从而降低了反复创建和关闭连接所带来的开销。
- 2. 提高性能
减少延迟:由于从池中重复使用连接,因此消除了建立连接所花费的时间,从而降低了延迟并加快了响应时间。
并发访问:连接池允许多个客户端通过管理一组连接来同时访问数据库。这对于有效处理高流量至关重要。
- 更好的资源利用率
连接限制:通过配置最大池大小,可以防止应用程序因同时连接过多而使数据库不堪重负,这可能会导致资源争用或数据库服务器过载。
空闲连接:连接池可以管理空闲连接,关闭在特定时间范围内未使用的连接,从而释放资源。
- 可靠性和稳定性
连接管理:连接池可以检测并关闭过时或断开的连接,确保您的应用程序仅使用有效的活动连接。这有助于保持应用程序的稳定性和可靠性。
故障转移处理:一些连接池可以处理数据库故障转移,即使在数据库临时停机的情况下也能维护连接池。
- 可扩展性
负载平衡:可以将连接池配置为在多个数据库实例之间分配负载,这在分布式或集群数据库设置中非常有用。
可扩展的应用程序:具有连接池的应用程序可以更有效地扩展,因为它们可以更有效地管理数据库连接,从而更好地处理增加的负载。
将 HikariCP 集成到 Spring Boot 应用程序中
在Spring Boot中,如果直接整合Spring Data JPA的话,不需要再额外添加其他依赖就可以使用。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.ajtech</groupId>
<artifactId>student</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>student</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
Entity:
package com.ajtech.student.entity;
import jakarta.persistence.*;
import lombok.*;
@Data
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name="student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String course;
}
Repository:
package com.ajtech.student.repo;
import com.ajtech.student.entity.Student;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface StudentRepository extends JpaRepository<Student, Long> {
}
Service:
package com.ajtech.student.service;
import com.ajtech.student.entity.Student;
import com.ajtech.student.repo.StudentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class StudentService {
@Autowired
private StudentRepository studentRepository;
public List<Student> getAllStudents() {
return studentRepository.findAll();
}
public Student getStudentById(Long id) {
return studentRepository.findById(id).orElse(null);
}
public Student saveStudent(Student student) {
return studentRepository.save(student);
}
public void deleteStudent(Long id) {
studentRepository.deleteById(id);
}
}
Controller:
package com.ajtech.student.controller;
import com.ajtech.student.entity.Student;
import com.ajtech.student.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/students")
public class StudentController {
@Autowired
private StudentService studentService;
@GetMapping
public List<Student> getAllStudents() {
return studentService.getAllStudents();
}
@GetMapping("/{id}")
public Student getStudentById(@PathVariable Long id) {
return studentService.getStudentById(id);
}
@PostMapping
public Student createStudent(@RequestBody Student student) {
return studentService.saveStudent(student);
}
@PutMapping("/{id}")
public Student updateStudent(@PathVariable Long id, @RequestBody Student student) {
Student existingStudent = studentService.getStudentById(id);
if (existingStudent != null) {
existingStudent.setName(student.getName());
existingStudent.setCourse(student.getCourse());
return studentService.saveStudent(existingStudent);
}
return null;
}
@DeleteMapping("/{id}")
public void deleteStudent(@PathVariable Long id) {
studentService.deleteStudent(id);
}
}
MySQL配置 + Hikari配置:
spring.application.name=student
server.port=9090
spring.datasource.url=jdbc:mysql://localhost:3306/test
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.show-sql=true
#spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
# HikariCP settings
spring.datasource.hikari.connection-timeout=20000
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=300000
spring.datasource.hikari.pool-name=HikariCP
spring.datasource.hikari.max-lifetime=600000
# Logging settings
logging.level.com.zaxxer.hikari.HikariConfig=DEBUG
logging.level.com.zaxxer.hikari=TRACE
没有回复内容