SpringBoot配置Druid监控
SpringBoot配置Druid监控
⾸先我们的项⽬是基于Druid连接池
Druid 具有以下特点:
亚秒级 OLAP 查询,包括多维过滤、Ad-hoc 的属性分组、快速聚合数据等等。
实时的数据消费,真正做到数据摄⼊实时、查询结果实时。
⾼效的多租户能⼒,最⾼可以做到⼏千⽤户同时在线查询。
扩展性强,⽀持 PB 级数据、千亿级事件快速处理,⽀持每秒数千查询并发。
极⾼的⾼可⽤保障,⽀持滚动升级。
1.在l⽂件中添加连接池的配置信息
# spring 配置
spring:
application:
name: imodule-nexus-service
# DataSource Config 数据源配置
datasource:
# 数据连接池类型
type: com.alibaba.druid.pool.DruidDataSource
# driver-class-name: sql.jdbc.Driver
# mysql-connector-java 8.0+ 使⽤这个新的接⼝
driver-class-name: sql.cj.jdbc.Driver
url: ${db.nexus.url}
username: ${db.nexus.username}
password: ${db.nexus.password}
# 初始化时建⽴物理连接的个数。初始化发⽣在显⽰调⽤init⽅法,或者第⼀次getConnection时
initial-size: 10
# 最⼤连接池连接数量,最⼤活跃连接数
max-active: 150
# 最⼩连接池连接数量,最⼩空闲数量
min-idle: 10
# 配置获取连接等待超时的时间
max-wait: 5000
# 是否缓存preparedStatement,也就是PSCache。PSCache对⽀持游标的数据库性能提升巨⼤,⽐如说oracle。在mysql下建议关闭。
pool-prepared-statements: false
# 指定每个连接上PSCache的⼤⼩
# max-pool-prepared-statement-per-connection-size: 20
# 和上⾯的等价
# max-open-prepared-statements:
# 指定检测连接sql,如果是null,会影响testWhileIdle、testOnBorrow、testOnReturn失效,如果底层代码use-ping-method是true,默认使⽤ping
validation-query: SELECT 1
validation-query-timeout: 500
# 申请连接时会使⽤validationQuery检测连接是否有效,true会降低性能,如果是true,并且检测到连接已关闭,会获取其它的可⽤的连接
test-on-borrow: false
# 归还连接时会使⽤validationQuery检测连接是否有效,true会降低性能,如果是true,并且检测到连接已关闭,会获取其它的可⽤的连接,放回数据库线程池
test-on-return: false
# 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果此连接空闲时间⼤于timeBetweenEvictionRunsMillis,执⾏validationQuery检测连接是否有效。
test-while-idle: true
# 1)配合testWhileIdle=true时使⽤,如果当前jdbc使⽤间隔⼤于timeBetweenEvictionRunsMillis配置的空闲连接过期时间,执⾏validationQuery检测连接是否有效。
# 数据库会主动超时并断开连接,因此建议timeBetweenEvictionRunsMillis⼩于数据库的连接主动断开时间(如mysql的wait_timeout和interactive_timeout)
# 2)配置间隔多久才进⾏⼀次检测,Destroy线程检测需要关闭的空闲连接的时间,单位是毫秒
time-between-eviction-runs-millis: 60000
# 配置⼀个连接在池中最⼩⽣存的时间,单位是毫秒
min-evictable-idle-time-millis: 30000
# max-evictable-idle-time-millis:
# 属性类型是字符串,通过别名的⽅式配置扩展插件,常⽤的插件有:监控统计⽤的filter:stat⽇志⽤的filter:log4j防御sql注⼊的filter:wall
# 配置多个英⽂逗号分隔
filters: stat,wall,log4j
# 通过connectProperties属性来打开mergeSql功能;记录慢SQL
connectionProperties: Sql=true;druid.stat.slowSqlMillis=5000
2.新增配置类 DruidConfig.java
这⾥需要注意  @ConfigurationProperties(prefix = "spring.datasource")指定的是Druid连接池配置信息l 层级关系⼀定要对应好,后⾯会指出和这⾥相关的问题package com.imodule.figuration;
import javax.sql.DataSource;
import org.t.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import t.annotation.Bean;
import t.annotation.Configuration;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
/**
* 线程池监控信息查看配置
*/
@Configuration
public class DruidConfig {
@Bean
public ServletRegistrationBean druidServlet() { // 主要实现WEB监控的配置处理
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(
new StatViewServlet(), "/druid/*"); // 现在要进⾏druid监控的配置处理操作
servletRegistrationBean.addInitParameter("allow", "127.0.0.1,10.1.1.1"); // ⽩名单
// servletRegistrationBean.addInitParameter("deny", "192.168.1.200"); // ⿊名单
servletRegistrationBean.addInitParameter("loginUsername", "admin"); // ⽤户名
servletRegistrationBean.addInitParameter("loginPassword", "admin"); // 密码
servletRegistrationBean.addInitParameter("resetEnable", "false"); // 是否可以重置数据源
return servletRegistrationBean ;
}
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean() ;
filterRegistrationBean.setFilter(new WebStatFilter());
filterRegistrationBean.addUrlPatterns("/*"); // 所有请求进⾏监控处理
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.css,/druid/*");
return filterRegistrationBean ;
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource druidDataSource() {
return new DruidDataSource();
}
}
3.项⽬中⽤到了Druid的话肯定会先在pom⾥⾯引⼊相关依赖的,⽬前我们这个项⽬中引⽤的druid 1.1.15
1. 使⽤组件common-dao层的依赖,统⼀引⽤的是 druid 1.1.15  (这个各公司的定义不同,意思就是说我们公司⾃定义的common包中包含了 druid 依赖,指定了版本号为1.1.15,所以我只需要直接引⽤common包就好了)
2.在引⽤公司的common包的时候排除druid依赖,然后再⾃⼰引⼊ druid-spring-boot-starter 包
保持⼀致,我使⽤的是⽅案⼀,整体统⼀哈哈哈哈(如果你们在使⽤的时候没有其他包引⽤了druid ,⾃⼰⼿动将以下其中依赖信息添加到l即可,具体版本信息可能还需要对应⼀下哦)
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.9</version>
</dependency>
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.1.15</version>
</dependency>
4.启动SpringBoot项⽬,执⾏main⽅法,启动成功后访问druid
进⼊如下登录页⾯,⽤户名及密码就是在DruidConfig.java中配置的信息(本例中是:admin/admin)
登录成功后,即可看到如下信息
5.配置Druid监控过程中出现过两个问题
问题1:
Failed to bind properties under 'spring.datasource' to javax.sql.DataSource:
Property: spring.datasource.filters
Value: stat,wall,log4j
Origin: class path resource [l]:53:14
Reason: org.apache.log4j.Logger
原因: spring.datasource下⾯的filters对⽇志的配置有问题,因为我项⽬中的⽇志为 slf4j,⽽连接池中配置的是log4j,所以出错了
处理⽅案:将 l ⾥⾯的 spring.datasource.filter 的 log4j 更改为 slf4j
问题2:启动没报错,也能正常访问Druid,但是Druid监控⾥⾯sql信息没有显⽰出来,数据源配置显⽰正常,连接池配置信息显⽰不正常,如下图所⽰
SQL监控:(执⾏查询数据库的脚本也没有任何信息显⽰)
这个问题纠结了我⼀上午了,查了⽆数遍,有⼈说是包的版本不对,也有⼈说是⽇志配置有问题... 都尝试了,不⾏
后来我眼睛⼀精,发现原来是我的配置⽂件l⾥⾯的内容定义有问题
原版配置⽂件在指定数据源配置信息:spring.datasource.DBINFO  spring.datasource.druid.DRUIDINFO
配置⽂件如下:
这个配置层级关系不对呀,在DruidConfig.java类中,我们指定的配置信息读取路径是 spring.datasource ,关于连接池信息⼜多了⼀层druid(spring.datasource.druid),所以连接池相关配置信息没有被读取到,只读取到了数据源信息,这就出现了上⽅问题2的错误现象了
处理⽅案:将druid这⼀层移除,调整后的配置⽂件如下
6.调整之后再次启动项⽬,访问druid监控,发现⼀切都正常了
7.最后提供⼀下完整的关于druid监控的l
# spring 配置
spring:
application:
name: demo-service
# DataSource Config 数据源配置
datasource:
# 数据连接池类型
type: com.alibaba.druid.pool.DruidDataSource
# driver-class-name: sql.jdbc.Driver
# mysql-connector-java 8.0+ 使⽤这个新的接⼝
driver-class-name: sql.cj.jdbc.Driver
druid连接池配置详解
url: ${db.nexus.url}
username: ${db.nexus.username}
password: ${db.nexus.password}
# 初始化时建⽴物理连接的个数。初始化发⽣在显⽰调⽤init⽅法,或者第⼀次getConnection时
initial-size: 10
# 最⼤连接池连接数量,最⼤活跃连接数
max-active: 150
# 最⼩连接池连接数量,最⼩空闲数量
min-idle: 10
# 配置获取连接等待超时的时间
max-wait: 5000
# 是否缓存preparedStatement,也就是PSCache。PSCache对⽀持游标的数据库性能提升巨⼤,⽐如说oracle。在mysql下建议关闭。
pool-prepared-statements: false
# 指定每个连接上PSCache的⼤⼩
# max-pool-prepared-statement-per-connection-size: 20
# 和上⾯的等价
# max-open-prepared-statements:
# 指定检测连接sql,如果是null,会影响testWhileIdle、testOnBorrow、testOnReturn失效,如果底层代码use-ping-method是true,默认使⽤ping
validation-query: SELECT 1
validation-query-timeout: 500
# 申请连接时会使⽤validationQuery检测连接是否有效,true会降低性能,如果是true,并且检测到连接已关闭,会获取其它的可⽤的连接
test-on-borrow: false
# 归还连接时会使⽤validationQuery检测连接是否有效,true会降低性能,如果是true,并且检测到连接已关闭,会获取其它的可⽤的连接,放回数据库线程池
test-on-return: false
# 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果此连接空闲时间⼤于timeBetweenEvictionRunsMillis,执⾏validationQuery检测连接是否有效。    test-while-idle: true
# 1)配合testWhileIdle=true时使⽤,如果当前jdbc使⽤间隔⼤于timeBetweenEvictionRunsMillis配置的空闲连接过期时间,执⾏validationQuery检测连接是否有效。
# 数据库会主动超时并断开连接,因此建议timeBetweenEvictionRunsMillis⼩于数据库的连接主动断开时间(如mysql的wait_timeout和interactive_timeout)
# 2)配置间隔多久才进⾏⼀次检测,Destroy线程检测需要关闭的空闲连接的时间,单位是毫秒
time-between-eviction-runs-millis: 60000
# 配置⼀个连接在池中最⼩⽣存的时间,单位是毫秒
min-evictable-idle-time-millis: 30000
# max-evictable-idle-time-millis:
# 属性类型是字符串,通过别名的⽅式配置扩展插件,常⽤的插件有:监控统计⽤的filter:stat⽇志⽤的filter:log4j防御sql注⼊的filter:wall
# 配置多个英⽂逗号分隔
filters: stat,wall,slf4j
# 通过connectProperties属性来打开mergeSql功能;记录慢SQL
connectionProperties: Sql=true;druid.stat.slowSqlMillis=5000

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。