使用 Spring 配置数据库连接池:HikariCP 与 Apache DBCP

引言

在现代企业级应用中,数据库连接池是一个关键组件,可以显著提高应用程序的性能和稳定性。Spring 框架提供了对多种连接池的支持,其中包括 HikariCP 和 Apache DBCP。这篇文章将详细介绍如何在 Spring 项目中配置这两种流行的数据库连接池。

配置 HikariCP

添加依赖

首先,需要在 pom.xml 文件中添加 HikariCP 和数据库驱动程序的依赖。以下是使用 H2 数据库的示例:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

配置文件

application.properties 文件中添加 HikariCP 的配置:

properties 复制代码
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=SpringBootHikariCP
spring.datasource.hikari.max-lifetime=2000000
spring.datasource.hikari.connection-timeout=30000

这些配置参数的含义如下:

  • minimum-idle: 连接池中维护的最小空闲连接数。
  • maximum-pool-size: 连接池中维护的最大连接数。
  • idle-timeout: 连接在池中保持空闲状态的最长时间。
  • pool-name: 连接池的名称。
  • max-lifetime: 连接在池中生存的最长时间。
  • connection-timeout: 等待连接超时的时间。

配置类

Spring Boot 默认使用 HikariCP 作为连接池,因此无需额外配置。但如果你需要自定义 DataSource,可以创建一个配置类:

java 复制代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.beans.factory.annotation.Value;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import javax.sql.DataSource;

@Configuration
public class DataSourceConfig {

    @Value("${spring.datasource.url}")
    private String dbUrl;

    @Value("${spring.datasource.username}")
    private String username;

    @Value("${spring.datasource.password}")
    private String password;

    @Value("${spring.datasource.hikari.minimum-idle}")
    private int minimumIdle;

    @Value("${spring.datasource.hikari.maximum-pool-size}")
    private int maximumPoolSize;

    @Value("${spring.datasource.hikari.idle-timeout}")
    private int idleTimeout;

    @Value("${spring.datasource.hikari.max-lifetime}")
    private int maxLifetime;

    @Value("${spring.datasource.hikari.connection-timeout}")
    private int connectionTimeout;

    @Bean
    public DataSource dataSource() {
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setJdbcUrl(dbUrl);
        hikariConfig.setUsername(username);
        hikariConfig.setPassword(password);
        hikariConfig.setMinimumIdle(minimumIdle);
        hikariConfig.setMaximumPoolSize(maximumPoolSize);
        hikariConfig.setIdleTimeout(idleTimeout);
        hikariConfig.setMaxLifetime(maxLifetime);
        hikariConfig.setConnectionTimeout(connectionTimeout);

        return new HikariDataSource(hikariConfig);
    }
}

配置 Apache DBCP

添加依赖

首先,需要在 pom.xml 文件中添加 Apache DBCP 和数据库驱动程序的依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-dbcp2</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

配置文件

application.properties 文件中添加 Apache DBCP 的配置:

properties 复制代码
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource
spring.datasource.dbcp2.min-idle=5
spring.datasource.dbcp2.max-idle=10
spring.datasource.dbcp2.max-open-prepared-statements=100
spring.datasource.dbcp2.max-total=20

这些配置参数的含义如下:

  • min-idle: 连接池中保持空闲的最小连接数。
  • max-idle: 连接池中保持空闲的最大连接数。
  • max-open-prepared-statements: 连接池中同时打开的最大预处理语句数。
  • max-total: 连接池中允许的最大连接数。

配置类

如果需要自定义 DataSource,可以创建一个配置类:

java 复制代码
import org.apache.commons.dbcp2.BasicDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.beans.factory.annotation.Value;

import javax.sql.DataSource;

@Configuration
public class DataSourceConfig {

    @Value("${spring.datasource.url}")
    private String dbUrl;

    @Value("${spring.datasource.username}")
    private String username;

    @Value("${spring.datasource.password}")
    private String password;

    @Value("${spring.datasource.dbcp2.min-idle}")
    private int minIdle;

    @Value("${spring.datasource.dbcp2.max-idle}")
    private int maxIdle;

    @Value("${spring.datasource.dbcp2.max-open-prepared-statements}")
    private int maxOpenPreparedStatements;

    @Value("${spring.datasource.dbcp2.max-total}")
    private int maxTotal;

    @Bean
    public DataSource dataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setUrl(dbUrl);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setMinIdle(minIdle);
        dataSource.setMaxIdle(maxIdle);
        dataSource.setMaxOpenPreparedStatements(maxOpenPreparedStatements);
        dataSource.setMaxTotal(maxTotal);

        return dataSource;
    }
}

结论

在本文中,我们详细介绍了如何在 Spring 项目中配置 HikariCP 和 Apache DBCP 数据库连接池。通过配置文件和自定义配置类,可以灵活地管理数据库连接池,提高应用程序的性能和稳定性。

希望本文能帮助你理解如何在 Spring 中使用和配置不同的数据库连接池。如果你有任何问题或建议,欢迎留言讨论。

相关推荐
卓怡学长3 小时前
w210基于springboot反诈平台设计与实现
java·spring boot·spring·intellij-idea
大模型码小白7 小时前
ChatGPT 的回答也能被结构化抓取?AI Bot Scraper 对比测评
服务器·开发语言·数据库·人工智能·spring·chatgpt
1001101_QIA7 小时前
从 CPU 到 GPU:高速缓存、指令并行与 CUDA 执行原理入门
java·后端·spring
卓怡学长7 小时前
w156一周穿搭App的设计与实现
java·spring boot·spring·maven·intellij-idea
杰克尼8 小时前
同城拼车项目面试问题_01
spring·面试·职场和发展
Java成神之路-9 小时前
基于 Spring AI+MCP 协议实现大模型调用本地自定义工具
java·spring·springaialibaba
SQL-First布道者9 小时前
我为什么把 MyBatis 从项目中删了?
java·spring·tomcat·mybatis·mybatis plus·spring jdbc
QCodingDev10 小时前
Spring AI 2.0企业级RAG实战:引用校验、无依据拒答与知识治理怎么做?
java·人工智能·spring·ai
名字还没想好☜10 小时前
Java 用 LinkedHashMap 三行实现 LRU 缓存:accessOrder、removeEldestEntry 与线程安全
java·后端·安全·spring·缓存
梁云亮19 小时前
spring整合Junit4
spring