目录
🍎前言
🍊为什么需要使用数据库连接池
🍊常见的连接池分类
🍎什么是Druid
🍊Druid的功能
🍊基本配置参数如下:
🍎整合Druid
🍊导入Druid数据源依赖
🍊配置数据源
🍊获取当前数据源
🍊根据需求配置数据源的配置
🍊绑定全局配置文件的参数
🍊配置Druid数据源监控
🍊配置DruidWeb监控Filter的过滤器
🍎总结
数据库连接池是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态的对池中连接进行申请、使用、释放
数据库连接是一件费事的操作,连接池可以使得多个操作共享一个连接,数据库连接池就是为数据库建立一个缓冲区。
当需要建立数据库连接时,只需要从缓冲区中取出一个,使用完毕后再放回去;使用数据库连接池可以提高对数据库连接资源的管理,数据库连接池负责分配、管理和释放数据库连接,允许程序重复使用一个现有的数据库连接,而不是重新建立一个;可以通过设定连接池最大连接数来防止系统无尽的与数据库连接
- DBCP连接池:采用标准的java EE JDBC API来实现,同时支持JNDI,非常灵活;但是版本比较老了,而且在高并发场景下性能可能存在问题
- C3P0连接池:C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展
- HikariCP连接池:专为高并发场景设计,性能优越,具有最快的初始化速度和最小的延迟,支持JDBC4 API;但是由于需要更多的JVM资源,可能会造成资源消耗问题
- druid连接池:支持JDBC和Oracle驱动程序徐,全面的性能检测,对等分布式,具有强大的扩展功能和高度定制和配置
Druid是阿里巴巴开源平台上一个数据库连接池实现,结合了c3p0、DBCP等DB池的优点,同时加入了日志监控
spring boot 2.0以上默认使用Hikari数据库连接池,可以说Hikari和Druid都是当前Java web上最优秀的数据库连接池
我们可以通过以下代码来查看我们所用的是什么连接池
@Autowired
private DataSource dataSource;
@Test
void test(){
System.out.println(dataSource.getClass());
}
| 配置 | 默认值 | 描述 |
|---|---|---|
| username | 连接数据库的用户名 | |
| password | 连接数据库的密码 | |
| jdbcUrl | 同DBCP中的jdbcUrl属性 | |
| driverClassName | 根据url自动识别 | 这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName |
| initialSize | 0 | 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 *参见DBCP中的initialSize属性 |
| maxActive | 8 | 最大连接池数量(Maximum number of Connections a pool will maintain at any given time.) *参见DBCP中的maxTotal属性 |
| maxIdle | 8 | 已经不再使用,配置了也没效果*参见DBCP中的maxIdle属性 |
| minIdle | 最小连接池数量 | |
| maxWait | 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。 | |
| poolPreparedState- ments | false | 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。 |
| maxOpenPrepared- Statements | -1 | 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100 |
| testOnBorrow | true | 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 |
| testOnReturn | false | 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 |
| testWhileIdle | false | 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 |
| validationQuery | 用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、 testWhileIdle都不会其作用。在mysql中通常为select ‘x’,在oracle中通常为select 1 from dual | |
| timeBetweenEviction-RunsMillis | 1) Destroy线程会检测连接的间隔时间 2) testWhileIdle的判断依据 | |
| minEvictableIdle- TimeMillis | Destory线程中如果检测到当前连接的最后活跃时间和当前时间的差值大于minEvictableIdleTimeMillis,则关闭当前连接。 | |
| removeAbandoned | 对于建立时间超过removeAbandonedTimeout的连接强制关闭 | |
| removeAbandoned-Timeout | 指定连接建立多长时间就需要被强制关闭 | |
| logAbandoned | false | 指定发生removeabandoned的时候,是否记录当前线程的堆栈信息到日志中 |
| filters | 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 1)监控统计用的filter:stat 2)日志用的filter:log4j 3)防御sql注入的filter:wall |
注意,我这里用的是springboot3.x版本,这里的druid数据源必须是1.2.19以上
错误导入:
com.alibaba druid-spring-boot-starter1.1.17
正确导入:
com.alibaba druid-spring-boot-3-starter1.2.21
springboot2.0以上默认使用的是hikari数据源,所以我们需要将数据源指定为Druid
spring:
datasource:
#druid数据源配置
druid:
username: root # mysql账号
password: root # mysql 密码
driver-class-name: com.mysql.cj.jdbc.Driver # 驱动包名
url: jdbc:mysql://localhost:3306/recordnetwork?useUnicode=true&characterEncoding=utf-8 # 连接地址
随后我们在通过以下方式重新获取一下,得到数据源就是druid的了,证明我们指定的数据源生效了

spring:
datasource:
#druid数据源配置
druid:
username: root # mysql账号
password: root # mysql 密码
driver-class-name: com.mysql.cj.jdbc.Driver # 驱动包名
url: jdbc:mysql://localhost:3306/recordnetwork?useUnicode=true&characterEncoding=utf-8 # 连接地址
# 初始化建立物理连接个数
initial-size: 5
# 最小连接数
min-idle: 5
# 最大连接数
max-active: 10
# 最大等待时间,单位毫秒
max-wait: 6000
# 检测连接是否有效
time-between-eviction-runs-millis: 60000
# 连接在池中的最小生存时间
min-evictable-idle-time-millis: 300000
# 检测连接是否有效的SQL 要求是一个查询语句
validation-query: SELECT 1 FROM DUAL
# 这些参数控制何时检测连接的有效性。
test-while-idle: true
test-on-borrow: false
test-on-return: false
# 是否缓存预编译的sql语句
pool-prepared-statements: true
# 配置监控统计拦截的filters,stat:监控统计,log4j:日志记录,wall:防御sql注入
filters: stat,wall,log4j
# 每个连接可缓存的预编译语句的最大数量。
max-pool-prepared-statement-per-connection-size: 20 #
# 是否启用全局的数据统计功能。
use-global-data-source-stat: true
# 连接属性,这里设置了合并SQL和慢查询的阈值(毫秒)。
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
注意:这些配置还没生效,因为还没有把自定义属性配置上去
我们在配置文件中配置了最大连接数10,初始化连接数为5
测试一下看看
@Autowired private DataSource dataSource; @Test void test(){ DruidDataSource druidDataSource = (DruidDataSource)dataSource; System.out.println("最大连接数:" + druidDataSource.getMaxActive()); System.out.println("初始化连接数:" + druidDataSource.getInitialSize()); }
发现是8和0是错的。

因为上面的配置用到了日志,我们需要导入一下log4j的依赖
log4j
log4j
1.2.17
package com.sxy.recordnetwork.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
/**
* druid配置类
*/
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource.druid")
@Bean
public DataSource druidDataSource() {
return new DruidDataSource();
}
}
然后我们再测试已经成功了

Druid提供了具有监控的功能,提供了一个web界面供用户查看,我们得设置Druid后台管理页面,如登录账号、密码等
spring:
datasource:
#druid数据源配置
druid:
// 其他配置
# 配置可视化控制台页面
stat-view-servlet:
enabled: true
# 访问druid监控页面的地址
url-pattern: /druid/*
# IP 白名单 没有配置或者为空则允许所有访问
allow:
# IP黑名单,若白名单也存在则优先使用
deny:
# 禁用重置按钮
reset-enable: true
# 登录所用的用户名与密码
login-username: admin
login-password: 123456
随后就可以访问监控页面了

spring:
datasource:
#druid数据源配置
druid:
#配置过滤器,过滤掉静态文件
web-stat-filter:
enabled: true
url-pattern: /*
exclusions: /druid/*,*.js,*.css,*.gif,*.jpg,*.bmp,*.png,*.ico
配置以上即可
以上就是Spring Boot3.x整合Druid的大致流程。
有什么问题还请各位在下方评论区留言,感谢支持!!!
更多内容请关注我的微信订阅号哦~

上一篇:MySQL--数据的增删改