引言
在现代的Web应用开发中,高性能的数据库连接池是确保应用稳定性和响应性的关键因素之一。Druid是一个开源的高性能数据库连接池,具有强大的监控和统计功能,能够在Spring Boot应用中提供出色的数据库连接管理。本文将研究在Spring Boot中集成Druid连接池的步骤,以及如何通过其丰富的特性优化应用的数据库性能。
数据库连接池
数据库连接池是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态的对池中的连接进行申请、使用、释放。
为什么需要使用数据库连接池
数据库连接是一件费时的操作,连接池可以使多个操作共享一个链接:数据库连接池的基本思想就是为数据库连接建立一个缓冲池,与现在缓冲池中放入一定数量
的连接,当需要建立数据库连接时,只需从缓冲池中取出一个,使用完毕后再放回去:使用数据库连接池可以提高对数据库连接资源的管理,数据库连接池负责分
配、管理和释放数据库连接,允许程序重复使用一个现有的数据库连接,而不是重新建立一个;可以通过设定连接池最大连接数来防止系统无尽的与数据库连接
常见的连接池种类
- JDBCP连接池:采用标准的java EE JDBC AP来实现,同时支持NDl,非常灵活;但是版本比较老了,而且在高并发场景下性能可能存在问题
- c3p0连接池:功能齐全,能够自动维护连接池,支持JDBC3规范和JDBC2的标准扩展,性能较好:但是配置过于复杂,容易造成资源浪费
- HikariCPi连接池:专为高并发场景设计,性能优越,具有最快的初始化速度和最小的延迟,支持JDBC4 API;但是由于需要更多的VM资源,可能会造成资源消耗问题
- druid连接池:支持DBC和Dracle驱动程序,全面的性能监测,对等分布式,具有强大的扩展功能和高度定制化配置
Druid介绍
Druid是一个阿里巴巴结合了c3p0、DBCP等DB池的优点开源的数据库连接池和SQL查询优化工具,用于提高应用程序对数据库的性能和可扩展性。主要提供的功能:数据库连接池、数据库连接池监控、SQL查询优化、数据源管理、防御SQL注入、统计和监控。
注意:SpringBoot2.0默认是用***.zaxxer.hikari.HikariDataSource作为数据源。
-
Druid功能
-
数据源监控: 显示数据源的基本信息、活跃连接数、连接等待数量等。
-
SQL监控: 统计SQL执行的次数、执行时间、错误次数等,帮助优化SQL性能。
-
日志监控: 展示Druid内部日志,帮助定位问题。
-
防火墙监控: 配置SQL防火墙规则,提高数据库安全性。
查看当前数据源的测试代码
@SpringBootTest
public class DruidTest {
@Autowired
private DataSource dataSource;
@Test
void test(){
System.out.println(dataSource.getClass());
}
}
druid 和 druid-spring-boot-starter区别
-
druid-spring-boot-starter
是在druid
基础上进行了封装,专用于集成spring-boot
项目,无需编写配置类文件。个性化的配置。为专用格式。按照SpringBoot整合其他技术的通用规则来,导入对应的starter,进行相应的配置即可。 -
druid
需要自己手动编写一个配置类文件。为通用格式,不管你换什么数据源都可以用这种形式进行配置。
druid传统的配置
-
引入Druid依赖
在Spring Boot项目的pom.xml
文件中,引入Druid和数据库驱动的相关依赖:
<!-- MyBatis-Plus -->
<dependency>
<groupId>***.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<!-- MySQL Connector 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
-
配置Druid连接池
在application.properties
或application.yml
中配置Druid连接池的相关参数:
spring:
datasource:
username: root
password: root
#?serverTimezone=UTC解决时区的报错
url: jdbc:mysql://localhost:3306/druid
driver-class-name: ***.mysql.jdbc.Driver
type: ***.alibaba.druid.pool.DruidDataSource
#Spring Boot 默认是不注入这些属性值的,需要自己绑定
#druid 数据源专有配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
#配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
#如果允许时报错 java.lang.ClassNotFoundException: org.apache.log4j.Priority
#则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.***/artifact/log4j/log4j
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
注意:这些配置暂时还没生效,因为这会还没有把自定义的属性配置上去
我们在配置文件中配置最大连接数为20,初始化连接数为5
测试一下看看
-
引入Druid依赖(根据自己配置参数按需引入)
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
-
绑定全局配置文件中的参数
package ***.example.config;
import ***.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;
//这是一个配置类 需要加@Configuration 这个注解
@Configuration
public class DruidConfig {
/*
将 自定义的 Druid数据源 添加到容器中,不再让 Spring Boot 自动创建(自动创建的是HikariDataSource)
绑定全局配置文件中的 druid 数据源属性到 ***.alibaba.druid.pool.DruidDataSource从而让它们生效,绑定操作就是加上以下注解
@ConfigurationProperties(prefix = "spring.datasource"):作用就是将 全局配置文件中
前缀为 spring.datasource的属性值注入到 ***.alibaba.druid.pool.DruidDataSource 的同名参数中
*/
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druidDataSource() {
return new DruidDataSource();
}
}
然后我们再测试一下刚才的测试方法看看配置是否生效
-
配置Druid数据源监控
Druid数据源具有监控的功能,并提供了一个web界面方便用户查看。我们需要设置Druid,后台管理页面,如登录账号、密码等.
//配置 Druid 监控管理后台的Servlet;
//因为springboot内置了 Servlet 容器,所以没有了web.xml文件, 替代的方法就是 ServletRegistrationBean (Spring Boot的注册 Servlet方式)
@Bean
public ServletRegistrationBean statViewServlet() {
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
// 这些参数可以在 ***.alibaba.druid.support.http.StatViewServlet 的父类 ***.alibaba.druid.support.http.ResourceServlet 中找到
//后台需要有人登录,账号密码的配置
Map<String, String> initParams = new HashMap<>();
initParams.put("loginUsername", "admin"); //后台管理界面的登录账号
initParams.put("loginPassword", "admin"); //后台管理界面的登录密码
//后台允许谁可以访问
//initParams.put("allow", "localhost"):表示只有本机可以访问
//initParams.put("allow", ""):为空或者为null时,表示允许所有访问
initParams.put("allow", "");
//deny:Druid 后台拒绝谁访问 initParams.put("user", "192.168.1.10");表示禁止此ip访问
//设置初始化参数
bean.setInitParameters(initParams);
return bean;
}
启动项目,访问http://localhost:8080/druid/login.html
输入配置账号登录
’
-
配置Druid Web监控Filter过滤器
//配置 Druid 监控 之 web 监控的 filter (在之前是在web.xml中配置过滤器)
//WebStatFilter:用于配置Web和Druid数据源之间的管理关联监控统计
@Bean
public FilterRegistrationBean webStatFilter() {
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
//exclusions:设置哪些请求进行过滤排除掉,从而不进行统计
Map<String, String> initParams = new HashMap<>();
initParams.put("exclusions", "*.js,*.css,/druid/*,/jdbc/*"); //这些东西不进行统计
bean.setInitParameters(initParams);
// "/*" 表示过滤所有请求
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
druid-spring-boot-starter配置
-
引入Druid配置
依赖是druid-spring-boot-starter,它基于传统的druid进行了封装,简化了配置,所以使用该依赖,同时引入log4j2的日志依赖,方便我们在监控时获取日志信息。
<dependency>
<groupId>***.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
-
Druid配置
基于application.yml进行配置
spring:
application:
name: druid-demo
datasource:
# 数据库相关配置
driver-class-name: ***.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis01
username: root
password: root
druid:
# 初始化连接数量
initial-size: 5
# 最小线连接数量
min-idle: 5
# 最大连接数量
max-active: 20
# 获取连接时最大等待时间,单位毫秒
max-wait: 60000
#销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接
min-evictable-idle-time-millis: 30000
#用来检测连接是否有效的sql 必须是一个查询语句
#mysql中为 select 'x'
#oracle中为 select 1 from dual
validation-query: select 'x'
#申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
test-on-borrow: false
#归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为tru
test-on-return: false
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
# 配置监拉统计挡成的filters. stat: 监控统计、Log4j:日志记录、waLL: 防御sqL注入
filters: stat,wall,log4j2
# 配置后台监控
stat-view-servlet:
# 允许访问的地址,这里因为时本地所以配置当前机器
allow: 127.0.0.1
# 是否开启访问
enabled: true
# 是否能够重置数据
reset-enable: false
# 管理页面登陆的用户名
login-username: admin
# 管理页面登陆的密码
login-password: admin
可以看到相较于传统的配置(不需要配置DruidConfig,仅仅作为对比)方式:
更加简洁了,开发人员只需要专注于配置信息,就可以快速的配置启用druid了,大大的提高了开发效率
结语
通过本文的介绍,你已经学会了在Spring Boot中集成Druid连接池的全过程,并了解了如何通过Druid的监控页面进行实时监控和统计。Druid连接池不仅提供了高性能的连接池功能,还附带了丰富的监控和统计工具,助力开发者更好地管理和优化数据库性能。在实际项目中,合理配置Druid连接池参数,结合监控页面,将会使应用的数据库性能达到事半功倍的效果。