本文共 6861 字,大约阅读时间需要 22 分钟。
com.alibaba druid-spring-boot-starter 1.1.9
可参考
在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。版本不匹配便会报驱动类已过时的错误。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 ServletRegistrationBeandruidServlet() { 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; }}
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(); }}
启动服务后访问:http://localhost:8080/druid/login.html
效果如下:转载地址:http://mhsui.baihongyu.com/