springBoot2数据库连接池自动装配原理,以及如何配置使用其他的数据库连接池(druid)为例
程序员文章站
2022-05-17 18:41:58
...
1.SpringBoot的数据库连接池的相关默认
- springBoot之前的版本默认使用的是Tomcat的数据库连接池
- 较新的版本2点多(具体多少我看看)默认使用的是Hikari(我使用的是2.2.1)
- 默认支持数据库连接池:
- Tomcat
- Hikari
- Dbcp2
2.springBoot默认的数据库连接池,以及自动装配原理
这部分可以通过查看数据库自动装配类:org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration
我们截取其中的一个Hikari的代码装配过程,其他两个默认支持的数据源原理一样:
- 首先这是个静态成员内部类Hikari,并使用了@Configuration,里面只有一个方法dataSource并且该方法使用@Bean;于是我们知道该类目的是生成一个Hikari连接池的bean
- @ConditionalOnClass({HikariDataSource.class}):HikariDataSource在类路径上存在时,@Configuration才生效
- @ConditionalOnMissingBean({DataSource.class}):DataSource的bean不存在时,@Configuration才生效,避免生成多个dataSource
- @ConditionalOnProperty:从配置文件读取name指定的属性的值与havingValue相等时,@Configuration才生效,但
havingValue = "true"使得当读取的值为空时该判断条件返回true,也就是说你不配置name指定的属性,该条件返回true,如果配置了name指定的属性,则与havingValue的值比较返回true或false
- 2、3、4同时成立,@Configuration才生效
- springBoot是怎么实现默认使用Hikari数据库连接池呢?答案是pringBoot默认支持的三个数据源(查看DataSourceConfiguration代码你就知道)中只集成了Hikari的jar包(条件2);
- @ConfigurationProperties(prefix = "spring.datasource.hikari"):自动为生成的bean(DataSource)注入配置文件的属性配置,如初始连接数,最大最小等等
- 当我们需要使用其他两个默认支持的两个数据库连接池时:
1.导入相关的jar包
2.配置spring.datasource.type为org.apache.commons.dbcp2.BasicDataSource或者org.apache.tomcat.jdbc.pool.DataSource
springBoot数据库连接池的自动装配原理到此为止
3.使用其他的数据库连接池:例如Druid
同样查看数据库自动装配类:org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration
可以看到当我们在配置文件配置使用其他非默认数据库连接池时,SpringBoot默认使用的数据库连接池Hikari不会生成使用,转而会生成我们配置使用的数据库连接池;
当我们使用非默认支持的数据库连接池时该如何做?以Druid为例:
1.添加相关的依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
2.配置文件:
spring:
datasource:
url:
username:
password:
type: com.alibaba.druid.pool.DruidDataSource
经过这两个步骤数据库连接池就能成功切换成Druid了
如果你想设置其他一些高级属性就需要自己定制配置类@Configuration,像org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration生成Hikari一样来生成自己想要的数据库连接池
Druid为例:
1.配置属性
spring:
datasource:
url:
username:
password:
type: com.alibaba.druid.pool.DruidDataSource
#高级属性
initialSize: 5
minIdle: 5
maxActive: 10
maxWait: 60000 #获取连接时最大等待时间,单位毫秒
2.手动生成
@Configuration
@ConditionalOnClass({DruidDataSource.class})
@ConditionalOnMissingBean({DataSource.class})
@ConditionalOnProperty(
name = {"spring.datasource.type"},
havingValue = "com.alibaba.druid.pool.DruidDataSource"
)
public class DruidConfig {
//该注解向bean自动注入对应的属性,属性在配置文件配置
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druid(){
return new DruidDataSource();
}
}
文章到此为止,有收获的点个赞
如果你想看druid高级功能,如监控sql以及慢sql日志输出,我的另一篇:
https://blog.csdn.net/to_study/article/details/103537295