SpringBoot常用数据源

SpringBoot下的常用数据源整合总结。

数据源介绍

常用数据源

SpringBoot常用的数据源包括:

  1. HikariCP:一个高性能的JDBC连接池,是Spring Boot默认的数据源。
  2. Druid:阿里巴巴开源的关系型数据库连接池和监控平台。
  3. C3P0:另一个稳定的JDBC连接池,尤其适用于长时间运行的应用程序。
  4. Apache Commons DBCP:另一个流行的JDBC连接池。
  5. Tomcat JDBC Pool:来自Tomcat的JDBC连接池实现。
  6. BoneCP:一个快速、轻量级的JDBC连接池。

前面四种比较常见,后面集中作为了解。具体选择哪种数据源取决于个人需求和性能优化要求。

性能:HiKariCP > Druid > DBCP > C3P0

ORM框架与自定义连接池

通常情况下,ORM框架会默认使用Spring Boot提供的连接池实现(例如Tomcat JDBC或HikariCP),这样就不需要额外配置连接池。但如果想要使用其他类型的连接池,也可以手动配置。

MybatisPlus默认使用的数据源是什么?MybatisPlus默认使用的数据源是Druid数据源。但是SpringBoot中使用的HikariCP数据源会覆盖MybatisPlus默认使用的Druid数据源。这是因为SpringBoot对于数据源的配置有自己的一套机制,会默认加载自带的HikariCP数据源,并将其作为默认数据源进行使用。当我们在项目中引入MybatisPlus时,它也会使用SpringBoot中的默认数据源,也就是HikariCP数据源。

SpringBoot自动装配Datasource

先欠着

HikariCP连接池(默认)

在SpringBoot2.0中,默认使用HikariCP连接池。

HikariCP简介

HikariCP是一个高性能、轻量级、可靠的JDBC连接池,具有快速启动、低延迟和高吞吐量等特点。它是目前最快的开源JDBC连接池,被广泛应用于Java应用程序中。

HikariCP是由日本程序员开源的一个数据库连接池组件,代码非常轻量,并且速度非常的快。根据官方提供的数据,在酷睿i7开启32个线程32个连接的情况下,进行随机数据库读写操作,HikariCP的速度是现在常用的C3P0数据库连接池的数百倍。

与其他JDBC连接池相比,HikariCP具有以下优势:

  1. 快速启动和低延迟:HikariCP采用了轻量级的设计,可以在瞬间启动,并且具有非常低的延迟,适合对响应时间要求较高的应用场景。
  2. 高吞吐量:HikariCP利用了多线程技术,可以同时处理大量的数据库请求,从而提高系统的吞吐量。
  3. 可靠性高:HikariCP支持连接池监控和心跳检测机制,可以及时识别连接故障并修复,提高应用程序的可靠性。
  4. 易于使用:HikariCP提供了简单易用的API接口,开发人员可以轻松地将其集成到Java应用程序中,大大减少了开发工作量。

配置过程

导入依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- 如果数据库服务器是5.7以下版本,驱动建议使用这个版本,如果使用高版本会导致时间问题-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.42</version>
<scope>runtime</scope>
</dependency>

<!-- JDBC场景启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

1
2
3
4
5
6
<!-- 如果数据库服务器是8,驱动建议使用这个版本-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>

application.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&useSSL=false&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456

# JDBC驱动程序的完全限定名称,默认情况下,基于URL自动检测。
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

# 数据源类型,SpringBoot2以后默认HikariDataSource
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
#连接池名称,默认HikariPool-1
spring.datasource.hikari.pool-name=YqHikariPool
#最大连接数,小于等于0会被重置为默认值10;大于零小于1会被重置为minimum-idle的值
spring.datasource.hikari.maximum-pool-size=12
#连接超时时间:毫秒,小于250毫秒,否则被重置为默认值30秒
spring.datasource.hikari.connection-timeout=60000
#最小空闲连接,默认值10,小于0或大于maximum-pool-size,都会重置为maximum-pool-size
spring.datasource.hikari.minimum-idle=10
#空闲连接超时时间:毫秒,默认值600000(10分钟),大于等于max-lifetime且max-lifetime>0,会被重置为0;不等于0且小于10秒,会被重置为10秒。
# 只有空闲连接数大于最大连接数且空闲时间超过该值,才会被释放
spring.datasource.hikari.idle-timeout=540000
#连接最大存活时间:毫秒.不等于0且小于30秒,会被重置为默认值30分钟.设置应该比mysql设置的超时时间短
spring.datasource.hikari.max-lifetime=540000
#连接测试查询
spring.datasource.hikari.connection-test-query=SELECT 1

整合MybatisPlus

MybatisPlus默认使用的数据源是Druid数据源。但是SpringBoot中使用的HikariCP数据源会覆盖MybatisPlus默认使用的Druid数据源。

添加依赖

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>

业务代码此处省略,与文章整合ORM框架相同。

运行测试

可以看到,顺利查出数据,并且使用的是HikariCP数据源

Druid连接池

Druid简介

官方文档:https://github.com/alibaba/druid

Druid(德鲁伊)是阿里巴巴开源的一个数据库连接池和监控平台,相比于传统的连接池它具有以下特点:

  1. 高效性:Druid具有更快的连接获取和释放速度,以及更好的性能表现。
  2. 安全性:Druid支持多种安全特性,如防SQL注入、用户权限控制等。
  3. 可扩展性:Druid提供了多样化的插件机制,可以方便地扩展其功能。
  4. 监控性:Druid集成了强大的监控功能,可以方便地对数据库连接池进行监控和分析。

在SpringBoot中整合Druid数据源非常简单,只需要添加Druid Starter依赖,并在配置文件中指定相关属性即可。同时,Druid还提供了一套完善的web监控平台,可以观察数据库连接情况、SQL执行情况、慢查询情况等,非常适合在生产环境中使用。

配置过程

导入依赖

替换jdbc,不替代mysql

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>

<!--&lt;!&ndash; JDBC场景启动器 &ndash;&gt;-->
<!--<dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-jdbc</artifactId>-->
<!--</dependency>-->

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
spring:
datasource:
# 可以不配置,根据url自动识别,建议配置
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
username: root
password: 123456
druid:
# 初始化连接池个数
initial-size: 5
# 最大连接池个数
max-active: 20
# 最小连接池个数
min-idle: 5
# 配置获取连接等待超时的时间,单位毫秒,缺省启用公平锁,并发效率会有所下降
max-wait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
time-between-eviction-runs-millis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
min-evictable-idle-time-millis: 300000
# 如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用
validation-query: SELECT 1 FROM DUAL
# 建议配置为true,不影响性能,并且保证安全性。
# 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
test-while-idle: true
# 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
test-on-borrow: false
# 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
test-on-return: false
# 打开PSCache,并且指定每个连接上PSCache的大小
pool-prepared-statements: true


整合MybatisPlus

业务代码如上所示,可以看到:

我们查询成功,并且使用的是Druid数据源

C3P0连接池

简介

C3P0连接池是一个Java库,用于管理JDBC连接。它提供了连接池和数据库连接管理器的实现,以便在应用程序中使用JDBC连接时更高效地使用数据库。C3P0连接池还提供了一些额外的功能:

  1. 连接池管理:自动跟踪连接状态,重试失败的连接,并处理空闲超时和资源泄漏等问题。
  2. 连接配置:可以设置连接的最大数量、最小数量、最大空闲时间,以及其他属性。
  3. 连接检查:可以设置定期检查连接是否有效,并清除无效连接。
  4. JDBC 3.0支持:支持JDBC 3.0规范中定义的DataSource接口。
  5. 数据源实现:提供了两种数据源实现方式,分别为ComboPooledDataSource和DriverManagerDataSource。

C3P0连接池可以大大提高应用程序与数据库之间的性能和可靠性,减少数据库连接资源的浪费和管理负担。

配置过程

导入依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- C3P0依赖 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.5</version>
</dependency>

<!-- MySQL数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>

在SpringBoot2中,可以使用YAML格式的配置文件来配置C3P0连接池。以下是一个示例:

1
2
3
4
5
6
7
8
9
10
spring:
datasource:
type: com.mchange.v2.c3p0.ComboPooledDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
username: root
password: 123456
maxPoolSize: 20
minPoolSize: 2

整合MybatisPlus

业务代码如上所示,可以看到:

我们查询成功,并且使用的是C3P0数据源。


SpringBoot常用数据源
http://wahoyu.xyz/2023/05/12/SpringBoot&DataSource/
作者
Wahoyu
发布于
2023年5月12日
许可协议