博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot学习历程(十):SpringBoot2.X集成整合Druid
阅读量:3983 次
发布时间:2019-05-24

本文共 6861 字,大约阅读时间需要 22 分钟。

SpringBoot学习历程(十):SpringBoot2.X集成整合Druid

前言

  • 本人github仓库地址:https://github.com/RabbitsInTheGrass/springBoot-Learning
  • 本人所用SpringBoot版本为2.1.9.RELEASE

1. 引入Druid依赖

com.alibaba
druid-spring-boot-starter
1.1.9

2. 增加配置信息

可参考

在application.yml中增加druid配置

spring:  datasource:    #数据库访问配置, 使用druid数据源    url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC    username: root    password: xijian    type: com.alibaba.druid.pool.DruidDataSource    #连接池配置    druid:      driver-class-name: com.mysql.cj.jdbc.Driver      initial-size: 5      min-idle: 5      max-active: 20      #连接等待超时时间      max-wait: 30000      #配置检测可以关闭的空闲连接间隔时间      time-between-eviction-runs-millis: 60000      #配置连接在池中的最小生存时间      min-evictable-idle-time-millis: 300000      #用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。      validation-query: select '1' from dual      #申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。      test-while-idle: true      #归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。      test-on-borrow: false      #建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。      test-on-return: false      #是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。      pool-prepared-statements: false      max-open-prepared-statements: 20      #要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100      max-pool-prepared-statement-per-connection-size: 20      #Spring监控AOP切入点,如x.y.z.service.*,配置多个英文逗号分隔      aop-patterns: com.xj.demo.servie.*      #合并多个DruidDataSource的监控数据      use-global-data-source-stat: true      #配置监控统计拦截的filters      filter:        #监控统计用的filter:stat        stat:          enabled: true          merge-sql: true          log-slow-sql: true          #配置SQL慢的标准,执行时间超过slowSqlMillis的就是慢          slow-sql-millis: 5000        #防御sql注入的filter:wall        wall:          enabled: true          config:            #是否允许执行DELETE语句            delete-allow: true            #是否允许修改表            drop-table-allow: true        slf4j:          enabled: true          statement-executable-sql-log-enable: true          #所有Statement相关的日志          statement-log-enabled: false

注意:

MySQL5用的驱动url是com.mysql.jdbc.Driver,MySQL6以后用的是com.mysql.cj.jdbc.Driver。版本不匹配便会报驱动类已过时的错误。

3. 增加DruidConfig配置类

package com.rabbits.learn.config;import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;import com.alibaba.druid.support.http.StatViewServlet;import com.alibaba.druid.support.http.WebStatFilter;import com.alibaba.druid.util.Utils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;import org.springframework.boot.web.servlet.FilterRegistrationBean;import org.springframework.boot.web.servlet.ServletRegistrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import javax.servlet.*;import java.io.IOException;import java.util.HashMap;import java.util.Map;/** * @Description: Druid配置类 * @Author: RabbitsInTheGrass_xj * @Date: 2019/10/1 19:46 */@Configurationpublic class DruidConfig {
private static final Logger logger = LoggerFactory.getLogger(DruidConfig.class); @Bean public ServletRegistrationBean
druidServlet() {
logger.info("--------------init Druid Servlet DruidConfig--------------"); ServletRegistrationBean
srBean = new ServletRegistrationBean<>(); srBean.setServlet(new StatViewServlet()); srBean.addUrlMappings("/druid/*"); // IP白名单 //srBean.addInitParameter("allow", "*"); // IP黑名单(共同存在时,deny优先于allow) //srBean.addInitParameter("deny", "192.168.1.100"); //控制台管理用户 srBean.addInitParameter("loginUsername", "admin"); srBean.addInitParameter("loginPassword", "admin"); //是否能够重置数据 禁用HTML页面上的“Reset All”功能 srBean.addInitParameter("resetEnable", "false"); return srBean; } @Bean public FilterRegistrationBean
filterRegistrationBean() {
FilterRegistrationBean
filterBean = new FilterRegistrationBean<>(new WebStatFilter()); filterBean.addUrlPatterns("/*"); Map
initParams = new HashMap
(); initParams.put("exclusions", "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"); filterBean.setInitParameters(initParams); return filterBean; } /** * 去除监控页面底部的广告 */ @SuppressWarnings({ "rawtypes", "unchecked" }) @Bean @ConditionalOnProperty(name = "spring.datasource.druid.filter.stat.enabled", havingValue = "true") public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties) { // 获取web监控页面的参数 DruidStatProperties.StatViewServlet config = properties.getStatViewServlet(); // 提取common.js的配置路径 String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*"; String commonJsPattern = pattern.replaceAll("\\*", "js/common.js"); final String filePath = "support/http/resources/js/common.js"; // 创建filter进行过滤 Filter filter = new Filter() { @Override public void init(javax.servlet.FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { chain.doFilter(request, response); // 重置缓冲区,响应头不会被重置 response.resetBuffer(); // 获取common.js String text = Utils.readFromResource(filePath); // 正则替换banner, 除去底部的广告信息 text = text.replaceAll("
", ""); text = text.replaceAll("powered.*?shrek.wang", ""); response.getWriter().write(text); } @Override public void destroy() { } }; FilterRegistrationBean registrationBean = new FilterRegistrationBean(); registrationBean.setFilter(filter); registrationBean.addUrlPatterns(commonJsPattern); return registrationBean; }}

4. DruidStatController类

package com.rabbits.learn.controller;import com.alibaba.druid.stat.DruidStatManagerFacade;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;/** * @Description: Druid监控 * @Author: RabbitsInTheGrass_xj * @Date: 2019/10/7 19:32 */@RestControllerpublic class DruidStatController {
private static final Logger logger = LoggerFactory.getLogger(DruidStatController.class); @GetMapping("/druid/stat") public Object druidStat() {
/* DruidStatManagerFacade.getDataSourceStatDataList该方法可以获取所有数据源的监控数据, 除此之外 DruidStatManagerFacade还提供了一些其他方法,可按需选择使用。 */ return DruidStatManagerFacade.getInstance().getDataSourceStatDataList(); }}

5. 测试效果

启动服务后访问:http://localhost:8080/druid/login.html

效果如下:
在这里插入图片描述

转载地址:http://mhsui.baihongyu.com/

你可能感兴趣的文章
Java的对象驻留
查看>>
自己动手写GC
查看>>
10个精妙的Java编码最佳实践
查看>>
Java 8新特性终极指南
查看>>
logback高级特性使用(二) 自定义Pattern模板
查看>>
微信产品经理和架构师们是靠什么扛住了10亿个红包
查看>>
JVM 线程堆栈分析过程详解
查看>>
JVM并发机制探讨—内存模型、内存可见性和指令重排序
查看>>
可扩展、高可用服务网络设计方案
查看>>
如何构建高扩展性网站
查看>>
微服务架构的设计模式
查看>>
技术领导力:作为技术团队领导经常为人所忽略的技能和职责
查看>>
持续可用与CAP理论 – 一个系统开发者的观点
查看>>
nginx+tomcat+memcached (msm)实现 session同步复制
查看>>
c++数组指针和指针数组详解
查看>>
c++指针常量与常量指针详解
查看>>
c++字符数组和字符指针区别以及str***函数
查看>>
c++的string类初始化及其常用函数
查看>>
c++类的操作符重载注意事项
查看>>
c++模板与泛型编程
查看>>