Spring Boot Hikari 连接池-Spring专区论坛-技术-SpringForAll社区

Spring Boot Hikari 连接池

d2b5ca33bd20241225113746

连接池是 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

 

 

 

 

请登录后发表评论

    没有回复内容