Druid 监控开启,新手可读性高

前言

  1. 复制黏贴即可使用,经过生产考验。
  2. 讲清楚配置类 DataSource 是如何使用,StatViewServlet 如何开启监控。

步骤

  1. 参考博客
  2. 流程图重点对象描述
  3. pom 文件。依赖的 jar 包
  4. application.yml 配置文件。配置了 Druid 的 DataSource
  5. DataSourceConfig 配置类和 DataSourceConfigProperties 类。配置了 dataSource 、Filters 、StatViewServelt
  6. Controller 类。测试类。
  7. SpringBootMain 类。

0. 参考博客

  1. Druid 参数解释 https://www.cnblogs.com/cymiao/p/8432681.html
  2. Druid 安全控制 账号密码、ip白名单
  3. 很好,SpringBoot 三种方式配置 Druid(包括纯配置文件配置)https://www.cnblogs.com/yjq520/p/10779356.html
  4. Druid 使用手册 https://www.bookstack.cn/read/Druid/2ced3e095b87961f.md

1. 流程图重点对象描述

在这里插入图片描述

2. pom 文件。依赖的 jar 包

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.jtfr</groupId>
    <artifactId>Spring-Druid</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
        <relativePath/>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc7</artifactId>
            <version>12.1.0.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.6</version>
        </dependency>
    </dependencies>

</project>

3. application.yml 配置文件。配置了 Druid 的 DataSource、StatViewServlet的账号密码ip

spring:
  application:
    # 应用名称
    name: Spring-Druid
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      driverClassName: oracle.jdbc.OracleDriver
      url: jdbc:oracle:xxx
      username: username
      password: password
      initial-size: 10
      max-active: 100
      min-idle: 10
      max-wait: 60000
      pool-prepared-statements: true
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      max-evictable-idle-time-millis: 60000
      validation-query: SELECT 1 FROM DUAL
      # validation-query-timeout: 5000
      test-on-borrow: false
      test-on-return: false
      test-while-idle: true
      max-open-prepared-statements: 20
      # 耗时监控
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
      # filters: #配置多个英文逗号分隔(统计stat,sql注入wall,log4j过滤log4j)
      filters: stat
      # statViewServlet 配置参数
      loginUsername: root
      loginPassword: root123
      resetEnable: false
      allow: 127.0.0.1

4. DataSourceConfig 配置类 和 DataSourceConfigProperties 类。配置了 dataSource 、StatViewServelt

package com.jtfr.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import com.jtfr.properties.DataSourceConfigProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
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;

/**
 * Druid数据库连接池配置文件
 */
@Configuration
@EnableConfigurationProperties(DataSourceConfigProperties.class)
public class DruidConfig {
    private static final Logger logger = LoggerFactory.getLogger(DruidConfig.class);
    @Value("${spring.datasource.druid.url}")
    private String dbUrl;
    @Value("${spring.datasource.druid.username}")
    private String username;
    @Value("${spring.datasource.druid.password}")
    private String password;
    @Value("${spring.datasource.druid.driverClassName}")
    private String driverClassName;
    @Value("${spring.datasource.druid.initial-size}")
    private int initialSize;
    @Value("${spring.datasource.druid.max-active}")
    private int maxActive;
    @Value("${spring.datasource.druid.min-idle}")
    private int minIdle;
    @Value("${spring.datasource.druid.max-wait}")
    private int maxWait;
    @Value("${spring.datasource.druid.pool-prepared-statements}")
    private boolean poolPreparedStatements;
    @Value("${spring.datasource.druid.time-between-eviction-runs-millis}")
    private int timeBetweenEvictionRunsMillis;
    @Value("${spring.datasource.druid.min-evictable-idle-time-millis}")
    private int minEvictableIdleTimeMillis;
    @Value("${spring.datasource.druid.max-evictable-idle-time-millis}")
    private int maxEvictableIdleTimeMillis;
    @Value("${spring.datasource.druid.validation-query}")
    private String validationQuery;
    @Value("${spring.datasource.druid.test-while-idle}")
    private boolean testWhileIdle;
    @Value("${spring.datasource.druid.test-on-borrow}")
    private boolean testOnBorrow;
    @Value("${spring.datasource.druid.test-on-return}")
    private boolean testOnReturn;
    @Value("${spring.datasource.druid.filters}")
    private String filters;
    @Value("{spring.datasource.druid.connection-properties}")
    private String connectionProperties;

    @Autowired
    private DataSourceConfigProperties dataSourceConfigProperties;

    /**
     * Druid dataSource 配置
     */
    @Bean
    public DruidDataSource dataSource() {
        DruidDataSource datasource = new DruidDataSource();
        datasource.setUrl(dbUrl);
        datasource.setUsername(username);
        datasource.setPassword(password);
        datasource.setDriverClassName(driverClassName);
        datasource.setInitialSize(initialSize);
        datasource.setMinIdle(minIdle);
        datasource.setMaxActive(maxActive);
        datasource.setMaxWait(maxWait);
        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        datasource.setMaxEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        datasource.setValidationQuery(validationQuery);
        datasource.setTestWhileIdle(testWhileIdle);
        datasource.setTestOnBorrow(testOnBorrow);
        datasource.setTestOnReturn(testOnReturn);
        datasource.setPoolPreparedStatements(poolPreparedStatements);
        datasource.setPoolPreparedStatements(true);
        try {
            datasource.setFilters(filters);
        } catch (Exception e) {
            logger.error("druid configuration initialization filter", e);
        }
        datasource.setConnectionProperties(connectionProperties);
        return datasource;
    }

    /**
     * 配置 Druid 监控界面, 监控界面是靠 StatViewServlet 对象开启的,一定要创建。
     */
    @Bean
    public ServletRegistrationBean statViewServlet(){
        ServletRegistrationBean servletRegistrationBean =
                new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
        // 设置控制台管理用户
        servletRegistrationBean.addInitParameter("loginUsername", dataSourceConfigProperties.getLoginUsername());
        servletRegistrationBean.addInitParameter("loginPassword", dataSourceConfigProperties.getLoginPassword());
        // 是否可以重置数据
        servletRegistrationBean.addInitParameter("resetEnable", dataSourceConfigProperties.getResetEnable());
        // 允许访问白名单
        servletRegistrationBean.addInitParameter("allow", dataSourceConfigProperties.getAllow());
        return servletRegistrationBean;
    }

    @Bean
    public FilterRegistrationBean statFilter(){
        //创建过滤器
        FilterRegistrationBean frb =
                new FilterRegistrationBean(new WebStatFilter());
        //设置过滤器过滤路径
        frb.addUrlPatterns("/*");
        //忽略过滤的形式
        frb.addInitParameter("exclusions",
                "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return frb;
    }
}
package com.jtfr.properties;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties("spring.datasource.druid")
public class DataSourceConfigProperties {

    private String loginUsername;
    private String loginPassword;
    private String resetEnable;
    private String allow;

    public String getLoginUsername() {
        return loginUsername;
    }

    public void setLoginUsername(String loginUsername) {
        this.loginUsername = loginUsername;
    }

    public String getLoginPassword() {
        return loginPassword;
    }

    public void setLoginPassword(String loginPassword) {
        this.loginPassword = loginPassword;
    }

    public String getResetEnable() {
        return resetEnable;
    }

    public void setResetEnable(String resetEnable) {
        this.resetEnable = resetEnable;
    }

    public String getAllow() {
        return allow;
    }

    public void setAllow(String allow) {
        this.allow = allow;
    }
}

5. Controller 类。测试类。

package com.jtfr.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("druidController")
public class DruidController {

    private static final Logger logger = LoggerFactory.getLogger(DruidController.class);

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @RequestMapping("/test")
    public String test (){
        String sql = "SELECT COUNT(1) FROM d_phone" ;
        Integer countOne = jdbcTemplate.queryForObject(sql,Integer.class) ;
        logger.info("countOne=="+countOne);
        return "success" ;
    }
}

6. SpringBootMain 类。

package com.jtfr;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootMain {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootMain.class, args);
    }
}

7. 思考

  1. 组件还是自己初始化好一些。比如现在的 Druid 的 dataSource
  2. application.yml 里面的值 可以任意的取,怎么写 key 都可以
  3. @Value 不靠谱的时候,使用 @EnableConfigurationProperties 注解提前加载配置文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值