锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. JAVA
  4. SpringBoot使用Druid连接池 + 配置监控页面(自定义版 + starter版)

SpringBoot使用Druid连接池 + 配置监控页面(自定义版 + starter版)

0
  • JAVA
  • 发布于 2024-08-07
  • 0 次阅读
黄健
黄健

本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net

目录

  • 1. Druid 连接池的功能
  • 2. 自定义版
    • 2.1 pom.xml 添加依赖
    • 2.2 MyDataSourceConfig 实现
    • 2.3 application.properties 配置
    • 编写 Controller 进行测试
    • 2.4 druid 监控页面查看
  • 3. starter 版
    • 3.1 pom.xml 添加依赖
    • 3.2 自动配置分析
    • 3.3 使用 application.properties 对 druid 进行配置
    • 3.4 druid 配置参考
  1. Druid 连接池的功能

全方位监控、防 SQL 注入攻击等

  1. 自定义版

2.1 pom.xml 添加依赖

添加 druid 连接池的依赖,如下所示:

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.15</version>
        </dependency>

2.2 MyDataSourceConfig 实现

说明如下:

  • @ConfigurationProperties(prefix = “spring.datasource”) 注解,将以 spring.datasource 开头的配置和 DataSource 类进行绑定,就可以在 application.properties 对 DataSource 的属性进行设置了
  • druidDataSource.setFilters(“stat,wall”):开启 SQL 监控、SQL 防火墙功能
  • 向 IOC 容器添加 ServletRegistrationBean 组件,开启 druid 监控功能。设置了 druid 监控的访问页面是 / druid/*;也设置了登录监控页面的账号和密码
  • 向 IOC 容器添加 FilterRegistrationBean 组件,开启 Web 应用菜单功能,让 druid 进行 Web 应用的统计。设置了统计的 Web URL 和排除的 Web URL
package com.hh.springboottest.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
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.sql.DataSource;
import java.sql.SQLException;
import java.util.Arrays;

@Configuration
public class MyDataSourceConfig {

    // 将application.properties中spring.datasource前缀对应的值赋值给DataSource类属性
    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource dataSource() {
        DruidDataSource druidDataSource = new DruidDataSource();

        try {
            // 开启SQL监控菜单功能,让druid进行SQL的执行统计
            // 开启SQL防火墙菜单功能
            druidDataSource.setFilters("stat,wall");

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return druidDataSource;
    }

    // 向IOC容器添加ServletRegistrationBean组件,开启druid监控功能
    @Bean
    public ServletRegistrationBean statViewServlet() {
        StatViewServlet statViewServlet = new StatViewServlet();
        ServletRegistrationBean<StatViewServlet> servletRegistrationBean =
                // druid监控的访问页面是/druid/*
                new ServletRegistrationBean<>(statViewServlet, "/druid/*");

        // 开启监控页面的访问登录账号和密码
        servletRegistrationBean.addInitParameter("loginUsername", "druid");
        servletRegistrationBean.addInitParameter("loginPassword", "123456");

        return servletRegistrationBean;
    }

    // 开启Web应用菜单功能,让druid进行Web应用的统计
    @Bean
    public FilterRegistrationBean webStatFilter() {
        WebStatFilter webStatFilter = new WebStatFilter();

        FilterRegistrationBean<WebStatFilter> filterRegistrationBean =
                new FilterRegistrationBean<>(webStatFilter);
        // 设置统计的Web URL
        filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));
        // 设置排除的Web URL
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");

        return filterRegistrationBean;
    }

}

2.3 application.properties 配置

在代码中可以对 DataSource 进行各种配置参数的 set,也可以在 application.properties 中对 durid 连接池进行配置,如下所示:

# 最好注释HikariDataSource
# spring.datasource.type=com.zaxxer.hikari.HikariDataSource

spring.datasource.filters=stat,wall
spring.datasource.max-active=12

编写 Controller 进行测试

package com.hh.springboottest.myController;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

@Slf4j
@RestController
public class HelloController {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Autowired
    DataSource dataSource;

    @ResponseBody
    @GetMapping("/queryFromDb")
    public String queryFromDb() {
        Long userCount = jdbcTemplate.queryForObject("select count(*) from user", Long.class);

        // 返回的结果是:数据库连接池类型为class com.alibaba.druid.pool.DruidDataSource
        log.info("数据库连接池类型为{}", dataSource.getClass());

        return userCount.toString();
    }

}

2.4 druid 监控页面查看

访问 http://localhost:8080/druid/index.html,页面效果如下:

其中数据源菜单在 RestController 等进行了调用才有结果显示

其中 SQL 监控页面如下。

SQL 监控项上,执行时间、读取行数、更新行数都有区间分布,将耗时分布成 8 个区间:

  • 耗时 0 到 1 毫秒的次数
  • 耗时 1 到 10 毫秒的次数
  • 耗时 10 到 100 毫秒的次数
  • 耗时 100 到 1000 毫秒的次数
  • 耗时 1 到 10 秒的次数
  • 耗时 10 到 100 秒的次数
  • 耗时 100 到 1000 秒的次数
  • 耗时 1000 秒以上的次数

耗时区间分布提供了 “执行 + RS 时分布”,是将执行时间 + ResultSet 持有时间合并监控,这个能方便诊断返回行数过多的查询

  1. starter 版

首先注释上面 MyDataSourceConfig 的 @Configuration 注解,或者删除 MyDataSourceConfig.java 文件。开始进行 starter 版的开发

3.1 pom.xml 添加依赖

添加 druid-spring-boot-starter 的依赖;和添加 spring-boot-starter-aop,用于 druid 监控页的 Spring 监控菜单。如下所示:

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

        <!-- 导入SprngBoot的aop的Starter,用于druid监控页的Spring监控菜单 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

可以看到自动添加了 druid、spring-boot-autoconfiguration 依赖

3.2 自动配置分析

查看 druid-spring-boot-starter-1.2.15.jar 的 DruidDataSourceAutoConfigure.class,可以看到:

  • DruidDataSourceAutoConfigure 是在 DataSourceAutoConfiguration 之前添加到 IOC 容器的,这样就先使用了 druid 连接池
  • 同时对 DruidStatProperties、DataSourceProperties 两个配置类进行了绑定
  • 向 IOC 容器添加了 DruidSpringAopConfiguration、DruidStatViewServletConfiguration、DruidWebStatFilterConfiguration.class、DruidFilterConfiguration 四个组件
  • 向 IOC 容器添加了 DataSource
package com.alibaba.druid.spring.boot.autoconfigure;
......省略部分......
@Configuration
@ConditionalOnClass({DruidDataSource.class})
@AutoConfigureBefore({DataSourceAutoConfiguration.class})
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})
@Import({DruidSpringAopConfiguration.class, DruidStatViewServletConfiguration.class, DruidWebStatFilterConfiguration.class, DruidFilterConfiguration.class})
public class DruidDataSourceAutoConfigure {
......省略部分......
@Bean(
        initMethod = "init"
    )
    @ConditionalOnMissingBean
    public DataSource dataSource() {
        LOGGER.info("Init DruidDataSource");
        return new DruidDataSourceWrapper();
    }
}

查看 DruidStatProperties 配置类,druid 的配置是由 spring.datasource.druid 开头的参数进行配置的

......省略部分......
@ConfigurationProperties("spring.datasource.druid")
public class DruidStatProperties {
......省略部分......
}

查看 DataSourceProperties 配置类,datasource 的配置是由 spring.datasource 开头的参数进行配置的

......省略部分......
@ConfigurationProperties(
    prefix = "spring.datasource"
)
public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean {
......省略部分......
}

查看 DruidSpringAopConfiguration 类,aop 相关的是由 spring.datasource.druid.aop-patterns 参数进行配置的,主要用来监控 SpringBean。对应 druid 监控页面的 Spring 监控菜单

......省略部分......
@ConditionalOnProperty({"spring.datasource.druid.aop-patterns"})
public class DruidSpringAopConfiguration {
......省略部分......
}

查看 DruidStatViewServletConfiguration 类,如下所示:

  • statViewServlet 相关的是由 spring.datasource.druid.stat-view-servlet.enabled 参数进行配置的,默认关闭
  • 向 IOC 容器添加了 ServletRegistrationBean 组件
  • 该类主要做了允许哪些 IP 可以访问监控页面,不允许哪些页面访问监控页面
  • 和设置监控页面的登录账号和密码
  • 和设置重置按钮的开启和关闭
......省略部分......
@ConditionalOnWebApplication
@ConditionalOnProperty(
    name = {"spring.datasource.druid.stat-view-servlet.enabled"},
    havingValue = "true"
)
public class DruidStatViewServletConfiguration {
    private static final String DEFAULT_ALLOW_IP = "127.0.0.1";

    public DruidStatViewServletConfiguration() {
    }

    @Bean
    public ServletRegistrationBean statViewServletRegistrationBean(DruidStatProperties properties) {
        DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
        ServletRegistrationBean registrationBean = new ServletRegistrationBean();
        registrationBean.setServlet(new StatViewServlet());
        registrationBean.addUrlMappings(new String[]{config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*"});
        if (config.getAllow() != null) {
            registrationBean.addInitParameter("allow", config.getAllow());
        } else {
            registrationBean.addInitParameter("allow", "127.0.0.1");
        }

        if (config.getDeny() != null) {
            registrationBean.addInitParameter("deny", config.getDeny());
        }

        if (config.getLoginUsername() != null) {
            registrationBean.addInitParameter("loginUsername", config.getLoginUsername());
        }

        if (config.getLoginPassword() != null) {
            registrationBean.addInitParameter("loginPassword", config.getLoginPassword());
        }

        if (config.getResetEnable() != null) {
            registrationBean.addInitParameter("resetEnable", config.getResetEnable());
        }

        return registrationBean;
    }
}

查看 DruidWebStatFilterConfiguration 类,如下所示:

  • WebStatFilter 相关的是由 spring.datasource.druid.web-stat-filter.enabled 参数进行配置的,默认关闭
  • 向 IOC 容器添加了 FilterRegistrationBean 组件
  • 该类设置了对哪些 Web URL 进行统计,哪些 Web URL 不进行统计 (比如: “.js,.gif,.jpg,.png,.css,.ico,/druid/*”)
......省略部分......
@ConditionalOnWebApplication
@ConditionalOnProperty(
    name = {"spring.datasource.druid.web-stat-filter.enabled"},
    havingValue = "true"
)
public class DruidWebStatFilterConfiguration {
    public DruidWebStatFilterConfiguration() {
    }

    @Bean
    public FilterRegistrationBean webStatFilterRegistrationBean(DruidStatProperties properties) {
        DruidStatProperties.WebStatFilter config = properties.getWebStatFilter();
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        WebStatFilter filter = new WebStatFilter();
        registrationBean.setFilter(filter);
        registrationBean.addUrlPatterns(new String[]{config.getUrlPattern() != null ? config.getUrlPattern() : "/*"});
        registrationBean.addInitParameter("exclusions", config.getExclusions() != null ? config.getExclusions() : "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        ......省略部分......
    }
......省略部分......
}

查看 DruidFilterConfiguration 类,是对所有 Druid 自己的 Filter 的配置,比如 wall 防火墙

......省略部分......
public class DruidFilterConfiguration {
    private static final String FILTER_STAT_PREFIX = "spring.datasource.druid.filter.stat";
    private static final String FILTER_CONFIG_PREFIX = "spring.datasource.druid.filter.config";
    private static final String FILTER_ENCODING_PREFIX = "spring.datasource.druid.filter.encoding";
    private static final String FILTER_SLF4J_PREFIX = "spring.datasource.druid.filter.slf4j";
    private static final String FILTER_LOG4J_PREFIX = "spring.datasource.druid.filter.log4j";
    private static final String FILTER_LOG4J2_PREFIX = "spring.datasource.druid.filter.log4j2";
    private static final String FILTER_COMMONS_LOG_PREFIX = "spring.datasource.druid.filter.commons-log";
    private static final String FILTER_WALL_PREFIX = "spring.datasource.druid.filter.wall";
    private static final String FILTER_WALL_CONFIG_PREFIX = "spring.datasource.druid.filter.wall.config";
    ......省略部分......
}

3.3 使用 application.properties 对 druid 进行配置

druid 的配置如下所示:

# 配置druid监控功能
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.login-username=druid
spring.datasource.druid.stat-view-servlet.login-password=123456
spring.datasource.druid.stat-view-servlet.reset-enable=false

# 开启druid监控页面的sql监控菜单、防火墙菜单
spring.datasource.druid.filters=stat,wall,slf4j

# 对filters里面的stat的详细配置
spring.datasource.druid.filter.stat.enabled=true
spring.datasource.druid.filter.stat.log-slow-sql=true
# 1秒
spring.datasource.druid.filter.stat.slow-sql-millis=1000

# 对filters里面的wall的详细配置
spring.datasource.druid.filter.wall.enabled=true
spring.datasource.druid.filter.wall.config.update-allow=true
spring.datasource.druid.filter.wall.config.drop-table-allow=false

# 配置Web应用菜单功能
spring.datasource.druid.web-stat-filter.enabled=true
spring.datasource.druid.web-stat-filter.url-pattern=/*
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*

# 监控指定路径下的SpringBean。用于Spring监控菜单
spring.datasource.druid.aop-patterns=com.hh.springboottest.*

3.4 druid 配置参考

连接池配置

spring.datasource.druid.initial-size=
spring.datasource.druid.max-active=
spring.datasource.druid.min-idle=
spring.datasource.druid.max-wait=
spring.datasource.druid.pool-prepared-statements=
spring.datasource.druid.max-pool-prepared-statement-per-connection-size= 
# 和上面的等价
spring.datasource.druid.max-open-prepared-statements=
spring.datasource.druid.validation-query=
spring.datasource.druid.validation-query-timeout=
spring.datasource.druid.test-on-borrow=
spring.datasource.druid.test-on-return=
spring.datasource.druid.test-while-idle=
spring.datasource.druid.time-between-eviction-runs-millis=
spring.datasource.druid.min-evictable-idle-time-millis=
spring.datasource.druid.max-evictable-idle-time-millis=
# 配置多个英文逗号分隔
spring.datasource.druid.filters=

监控配置

# WebStatFilter配置,说明请参考Druid Wiki,配置_配置WebStatFilter
 # 是否启用StatFilter,默认值false
spring.datasource.druid.web-stat-filter.enabled=
spring.datasource.druid.web-stat-filter.url-pattern=
spring.datasource.druid.web-stat-filter.exclusions=
spring.datasource.druid.web-stat-filter.session-stat-enable=
spring.datasource.druid.web-stat-filter.session-stat-max-count=
spring.datasource.druid.web-stat-filter.principal-session-name=
spring.datasource.druid.web-stat-filter.principal-cookie-name=
spring.datasource.druid.web-stat-filter.profile-enable=

 # StatViewServlet配置,说明请参考Druid Wiki,配置_StatViewServlet配置
 # 是否启用StatViewServlet(监控页面),默认值为false(考虑到安全问题默认并未启动,如需启用建议设置密码或白名单以保障安全)
spring.datasource.druid.stat-view-servlet.enabled=
spring.datasource.druid.stat-view-servlet.url-pattern=
spring.datasource.druid.stat-view-servlet.reset-enable=
spring.datasource.druid.stat-view-servlet.login-username=
spring.datasource.druid.stat-view-servlet.login-password=
spring.datasource.druid.stat-view-servlet.allow=
spring.datasource.druid.stat-view-servlet.deny=

 # Spring监控配置,说明请参考Druid Github Wiki,配置_Druid和Spring关联监控配置
 # Spring监控AOP切入点,如x.y.z.service.*, 配置多个英文逗号分隔
spring.datasource.druid.aop-patterns=
标签: #JAVA 991
相关文章

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

SpringBoot整合异步任务执行 2024-10-08 11:24

同步任务: 同步任务是在单线程中按顺序执行,每次只有一个任务在执行,不会引发线程安全和数据一致性等 并发问题 同步任务需要等待任务执行完成后才能执行下一个任务,无法同时处理多个任务,响应慢,影响用 户体验 异步任务: 异步任务是在多线程中同时执行,多个任务可以并发执行,同时处理多个请求,响应快,资源

springboot kafka多数据源,通过配置动态加载发送者和消费者 2024-10-08 11:24

前言 最近做项目,需要支持kafka多数据源,实际上我们也可以通过代码固定写死多套kafka集群逻辑,但是如果需要不修改代码扩展呢,因为kafka本身不处理额外逻辑,只是起到削峰,和数据的传递,那么就需要对架构做一定的设计了。 准备test kafka本身非常容易上手,如果我们需要单元测试,引入ja

SpringBoot 集成 Redis 2024-10-08 11:24

一:SpringBoot 集成 Redis ①Redis是一个 NoSQL(not only)数据库, 常作用缓存 Cache 使用。 ②Redis是一个中间件、是一个独立的服务器;常用的数据类型: string , hash ,set ,zset , list ③通过Redis客户端可以使用多种语

SpringBoot整合QQ邮箱 2024-10-08 11:24

SpringBoot可以通过导入依赖的方式集成多种技术,这当然少不了我们常用的邮箱,现在本章演示SpringBoot整合QQ邮箱发送邮件…. 下面按步骤进行: 1.获取QQ邮箱授权码 1.1 登录QQ邮箱 1.2 开启SMTP服务 找到下图中的SMTP服务区域,如果当前账号未开启的话自己手动开启。

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.