Druid是阿里巴巴开发的号称为监控而生的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource等等等,秒杀一切。Druid可以很好的监控DB池连接和SQL的执行情况,天生就是针对监控而生的DB连接池。
官方的参考
https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
一、传统web项目(如ssh,ssm)
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.23</version>
</dependency>
使用xml或配置类配置好DruidDataSource
<!--使用druid数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init">
<!--注入连接属性-->
<property name="driverClassName" value="xxx"/>
<property name="url" value="xxx"/>
<property name="username" value="xxx"/>
<property name="password" value="xxx"/>
<!--初始化连接池大小-->
<property name="initialSize" value="5"></property>
<!--设置最大连接数-->
<property name="maxActive" value="20"></property>
<!--设置等待时间-->
<property name="maxWait" value="5000"/>
<!--配置数据源监控的filter-->
<property name="filters" value="stat"></property>
</bean>
在web应用中的WEB-INF/web.xml中进行相关配置
<servlet>
<servlet-name>StatViewServlet</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
<!--登陆名-->
<init-param>
<param-name>loginUsername</param-name>
<param-value>admin</param-value>
</init-param>
<!-- 登录密码-->
<init-param>
<param-name>loginPassword</param-name>
<param-value>2024</param-value>
</init-param>
<!--白名单-->
<init-param>
<param-name>allow</param-name>
<param-value></param-value>
</init-param>
<!--黑名单-->
<init-param>
<param-name>deny</param-name>
<param-value></param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>StatViewServlet</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>
<filter>
<filter-name>WebStatFilter</filter-name>
<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
<!--过滤的样式-->
<init-param>
<param-name>exclusions</param-name>
<param-value>*.js,*.gif,*.css,*.ico,*.jpg,*.png,/druid/*</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>WebStatFilter</filter-name>
<servlet-name>StatViewServlet</servlet-name>
</filter-mapping>
二、springboot中引入原生的druid,依赖和上面一样,编写配置类即可
import com.alibaba.druid.filter.Filter;
import com.alibaba.druid.filter.stat.StatFilter;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.wall.WallConfig;
import com.alibaba.druid.wall.WallFilter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Configuration
public class DruidConfig {
//登陆账号
private final String USERNAME = "root";
//登陆密码
private final String PASSWORD = "123";
@Value("${spring.datasource.url:#{null}}")
private String dbUrl;
@Value("${spring.datasource.username: #{null}}")
private String username;
@Value("${spring.datasource.password:#{null}}")
private String password;
@Value("${spring.datasource.driverClassName:#{null}}")
private String driverClassName;
/**
* 以下属性可在配置文件自行定义
*/
private Integer initialSize = 5;
private Integer minIdle = 10;
private Integer maxActive = 20;
private Integer maxWait = 60000;
@Bean
@Primary
public DruidDataSource dataSource() {
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(this.dbUrl);
datasource.setUsername(username);
datasource.setPassword(password);
datasource.setDriverClassName(driverClassName);
if (initialSize != null) {
datasource.setInitialSize(initialSize);
}
if (minIdle != null) {
datasource.setMinIdle(minIdle);
}
if (maxActive != null) {
datasource.setMaxActive(maxActive);
}
if (maxWait != null) {
datasource.setMaxWait(maxWait);
}
List<Filter> filters = new ArrayList<>();
filters.add(statFilter());
filters.add(wallFilter());
datasource.setProxyFilters(filters);
return datasource;
}
@Bean
public ServletRegistrationBean druidServlet() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
servletRegistrationBean.setServlet(new StatViewServlet());
servletRegistrationBean.addUrlMappings("/druid/*");
Map<String, String> initParameters = new HashMap<>();
//禁用HTML页面上的“Rest All”功能
initParameters.put("resetEnable", "false");
//ip白名单(没配置则允许所有访问)
//initParameters.put("allow", "");
//ip黑名单,如果某个ip同时存在,deny优先于allow
//initParameters.put("deny", "");
initParameters.put("loginUsername", USERNAME);
initParameters.put("loginPassword", PASSWORD);
servletRegistrationBean.setInitParameters(initParameters);
return servletRegistrationBean;
}
@Bean
public StatFilter statFilter() {
StatFilter statFilter = new StatFilter();
//慢sql记录
statFilter.setLogSlowSql(true);
statFilter.setMergeSql(true);
//超过多少时间为慢sql
statFilter.setSlowSqlMillis(3000);
return statFilter;
}
@Bean
public WallFilter wallFilter() {
WallFilter wallFilter = new WallFilter();
//允许执行多条SQL
WallConfig config = new WallConfig();
config.setMultiStatementAllow(true);
wallFilter.setConfig(config);
return wallFilter;
}
}
三、springboot druid starter方式
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.23</version>
</dependency>
按需配置application.yml的内容
spring:
datasource:
url: ******
username: ******
password: ******
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource # 指定数据源类型
######### 连接池 配置 ##########
druid:
# 配置初始化大小、最小、最大
initial-size: 5
minIdle: 10
max-active: 20
# 配置获取连接等待超时的时间(单位:毫秒)
max-wait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
# time-between-eviction-runs-millis: 2000
# 配置一个连接在池中最小生存的时间,单位是毫秒
# min-evictable-idle-time-millis: 600000
# max-evictable-idle-time-millis: 900000
# 用来测试连接是否可用的SQL语句,默认值每种数据库都不相同,这是mysql
# validationQuery: select 1
# 应用向连接池申请连接,并且testOnBorrow为false时,连接池将会判断连接是否处于空闲状态,如果是,则验证这条连接是否可用
# testWhileIdle: true
# 如果为true,默认是false,应用向连接池申请连接时,连接池会判断这条连接是否是可用的
# testOnBorrow: false
# 如果为true(默认false),当应用使用完连接,连接池回收连接的时候会判断该连接是否还可用
# testOnReturn: false
# 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle
# poolPreparedStatements: true
# 要启用PSCache,必须配置大于0,当大于0时, poolPreparedStatements自动触发修改为true,
# 在Druid中,不会存在Oracle下PSCache占用内存过多的问题,
# 可以把这个数值配置大一些,比如说100
# maxOpenPreparedStatements: 20
# 连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作
# keepAlive: true
# Spring 监控,利用aop 对指定接口的执行时间,jdbc数进行记录
aop-patterns: "com.springboot.template.dao.*"
########### 启用内置过滤器(第一个 stat必须,否则监控不到SQL)##########
filters: stat,wall,log4j2
# 自己配置监控统计拦截的filter
filter:
# 开启druiddatasource的状态监控
stat:
enabled: true
db-type: mysql
# 开启慢sql监控,超过2s 就认为是慢sql,记录到日志中
log-slow-sql: true
slow-sql-millis: 2000
# 日志监控,使用slf4j 进行日志输出
# slf4j:
# enabled: true
# statement-log-error-enabled: true
# statement-create-after-log-enabled: false
# statement-close-after-log-enabled: false
# result-set-open-after-log-enabled: false
# result-set-close-after-log-enabled: false
########## 配置WebStatFilter,用于采集web关联监控的数据 ##########
web-stat-filter:
# 启动 StatFilter
enabled: true
# 过滤所有url
url-pattern: /*
# 排除一些不必要的url
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
# 开启session统计功能
session-stat-enable: true
# session的最大个数,默认100
session-stat-max-count: 1000
########## 配置StatViewServlet(监控页面),用于展示Druid的统计信息 ##########
stat-view-servlet:
# 启用StatViewServlet
enabled: true
# 访问内置监控页面的路径,内置监控页面的首页是/druid/index.html
url-pattern: /druid/*
# 不允许清空统计数据,重新计算
reset-enable: false
# 配置监控页面访问密码
login-username: root
login-password: 123
# 允许访问的地址,如果allow没有配置或者为空,则允许所有访问
# allow:
# 拒绝访问的地址,deny优先于allow,如果在deny列表中,就算在allow列表中,也会被拒绝
# deny:
访问监控页面
页面简单介绍
1、数据源页面:是当前DataSource配置的基本信息,上述配置的Filter可以在里面找到,如果没有配置Filter(一些信息会无法统计,例如“SQL监控”,会无法获取JDBC相关的SQL执行信息)。
2、SQL监控页面:统计了所有SQL语句的执行情况。
3、URL监控页面:统计了所有Controller接口的访问以及执行情况。
4、Spring 监控页面,利用aop 对指定接口的执行时间,jdbc数进行记录。
5、SQL防火墙页面:druid提供了黑白名单的访问,可以清楚的看到sql防护情况。
6、Session监控页面:可以看到当前的session状况,创建时间、最后活跃时间、请求次数、请求时间等详细参数。
7、JSONAPI 页面:通过api的形式访问Druid的监控接口,api接口返回Json形式数据。