springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。

druid数据源

Druid 是一个分布式的、支持实时多维 OLAP 分析的数据处理系统。它既支持高速的数据实时摄入处理,也支持实时且灵活的多维数据分析查询。因此 Druid 最常用的场景就是大数据背景下、灵活快速的多维 OLAP 分析。 另外,Druid 还有一个关键的特点:它支持根据时间戳对数据进行预聚合摄入和聚合分析,因此也有用户经常在有时序数据处理分析的场景中用到它。

Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能

自定义配置druid数据源

1.引入依赖

首先,在pom.xml中,添加druid的依赖,jdbc的stater,以及mysql驱动:

        <!--  jdbc stater      -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!--   mysql驱动     -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>
        <!--   druid数据源     -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.17</version>
        </dependency>

2.配置自定义dataSoruce的Bean组件

默认情况下,springboot会使用Hikari数据源,默认的自动配置时判断容器中没有才会去配置 @ConditionalOnMissingBean(DataSource.class)。

使用@Configuration标识这个类是一个配置类

package com.robin.boot.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


import javax.sql.DataSource;

@Configuration
public class MyDataSourceConfig {
   


    // 默认情况下,springboot会使用Hikari数据源
    // 默认的自动配置时判断容器中没有才会去配置 @ConditionalOnMissingBean(DataSource.class)
    @Bean
    public DataSource dataSource(){
   
        DruidDataSource druidDataSource = new DruidDataSource();
        // 设定数据源的初始配置,数据库的账户密码,url,以及jdbc驱动
        druidDataSource.setUrl("jdbc:mysql://localhost:3306/phpdemo?characterEncoding=" +
                "utf8&serverTimezone=Asia/Shanghai&useSSL=false");
        druidDataSource.setUsername("root");
        druidDataSource.setPassword("root");
        druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        return druidDataSource;
    }
}

3.测试sql,验证数据源是否配置成功

在当前springboot项目中的测试类中,进行测试,使用原生的jdbcTemplate去测试,并且使用slf4j日志来查看输出信息。

package com.robin.boot;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

@Slf4j
@SpringBootTest
class DemoReSqlApplicationTests {
   

    @Autowired 
    JdbcTemplate jdbcTemplate;

    @Autowired
    DataSource dataSource;

    @Test
    void contextLoads() {
   
        Long aLong = jdbcTemplate.queryForObject("select count(*) from phpdemo.book", Long.class);
        log.info("记录数为{}",aLong);
        log.info("数据源{}",dataSource.getClass());
    }

}

ok,数据源配置成功…
在这里插入图片描述

4.开启 StatFilter,wallFilter,lg4j以及内置监控信息页面

Druid内置提供一个StatFilter,wallfilter,用于统计监控信息及sql防火墙。也可以使用日志记录信息log4j。

查看druid官方文档,其提供的xml配置如下:

  <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
      ... ...
      <property name="filters" value="stat,wall,log4j" />
  </bean>

dataSource对应的bean组件,我们已经在上面创建过了,所以开启统计信息只需要在bean组件中,添加属性即可
// 开启stat sql监控信息 druidDataSource.setFilters("stat,wall,log4j");

开启druid内置监控页面,Druid内置提供了一个StatViewServlet用于展示Druid的统计信息。
其官网提供的xml配置如下:

<!-- 配置 Druid 监控信息显示页面 -->  
<servlet>  
    <servlet-name>DruidStatView</servlet-name>  
    <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>  
    <init-param>  
    <!-- 允许清空统计数据 -->  
    <param-name>resetEnable</param-name>  
    <param-value>true</param-value>  
    </init-param>  
    <init-param>  
    <!-- 用户名 -->  
    <param-name>loginUsername</param-name>  
    <param-value>druid</param-value>  
    </init-param>  
    <init-param>  
    <!-- 密码 -->  
    <param-name>loginPassword</param-name>  
    <param-value>druid</param-value>  
    </init-param>  
</servlet>  
<servlet-mapping>  
    <servlet-name>DruidStatView</servlet-name>  
    <url-pattern>/druid/*</url-pattern>  
</servlet-mapping>

自定义Servlet来使用druid的内置监控页面:

使用 ServletRegistrationBean 类来创建一个自定义的servlet,且其名字为statViewServlet

     @Bean
    public ServletRegistrationBean statViewServlet(){
   
        StatViewServlet statViewServlet = new StatViewServlet();
        // 配置自定义的servlet,以及要处理的请求响应
        ServletRegistrationBean<StatViewServlet> registrationBean =
                new ServletRegistrationBean<>(statViewServlet,"/druid/*");
        // 设定druid内置监控页面的登录账号密码信息
        registrationBean.addInitParameter("loginUsername","admin");
        registrationBean.addInitParameter("loginPassword","robin");
        // 设置禁止清空内置监控页面数据信息
        registrationBean.addInitParameter("resetEnable","false");
        return registrationBean;
    }

运行访问localhost:8080/druid,自动跳转到druid监控页面的登录页,输入刚刚自定义的账号密码,登入查看:

在这里插入图片描述
在这里插入图片描述

此时我们的druid内置监控页面已经开启啦~~

5.开启Web关联监控配置

其官网提供的xml配置如下:

  <filter>
      <filter-name>DruidWebStatFilter</filter-name>
      <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
      <init-param>
          <param-name>exclusions</param-name>
          <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
      </init-param>
  </filter>
  <filter-mapping>
      <filter-name>DruidWebStatFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

就是一个名为DruidWebStatFilter的拦截器,类型为com.alibaba.druid.support.http.WebStatFilter。

使用 FilterRegistrationBean 创建一个自定义的filter,且其名为webStatFilter。

    @Bean
    public FilterRegistrationBean webStatFilter(){
   
        WebStatFilter webStatFilter = new WebStatFilter();
        FilterRegistrationBean<WebStatFilter> registrationBean =
                new FilterRegistrationBean<WebStatFilter>(webStatFilter);
        // 设置拦截路径
        registrationBean.setUrlPatterns(Arrays.asList("/*"));
        // 设置放行路径
        registrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return registrationBean;
    }

6.开启Spring关联监控配置

Druid提供了Spring和Jdbc的关联监控。有两种方式,按类型拦截配置和方法名正则匹配拦截配置。

     <!-- 1.按类型拦截配置-->
   <bean id="druid-stat-interceptor"
      class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
  </bean>

  <bean id="druid-type-proxyCreator" class="com.alibaba.druid.support.spring.stat.BeanTypeAutoProxyCreator">
      <!-- 所有ABCInterface的派生类被拦截监控  -->
      <property name="targetBeanType" value="xxxx.ABCInterface" />
      <property name="interceptorNames">
          <list>
              <value>druid-stat-interceptor</value>
          </list>
      </property>
  </bean>
    <bean id="druid-stat-interceptor"
      class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
  </bean>

<!--2.方法名正则匹配拦截配置 -->
  <bean id="druid-stat-interceptor"
      class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
  </bean>

<bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut"
    scope="prototype">
    <property name="patterns">
        <list>
            <value>com.mycompany.service.*</value>
            <value>com.mycompany.dao.*</value>
        </list>
    </property>
</bean>

<aop:config>
    <aop:advisor advice-ref="druid-stat-interceptor"
        pointcut-ref="druid-stat-pointcut" />
</aop:config>

7.编写controller,测试sql是否会被监控页面看到

使用原生的jdbctemplate,将sql进行查询,然后通过@GetMapping(“/sql”),映射请求。

package com.robin.boot.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class SqlTestController {
   

    @Autowired
    JdbcTemplate jdbcTemplate;

    @ResponseBody
    @GetMapping("/sql")
    public String querySql(){
   
        Long aLong = jdbcTemplate.queryForObject("select count(*) from phpdemo.book", Long.class);
        return aLong.toString();
    }

}

8.统一测试,查看监控页面

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

除了spring监控(没有配置),其余都正确监控了

9.完整的自定义配置druid数据源,和项目结构

完整的自定义配置druid数据源:

package com.robin.boot.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.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 {
   


    // 默认情况下,springboot会使用Hikari数据源
    // 默认的自动配置时判断容器中没有才会去配置 @ConditionalOnMissingBean(DataSource.class)
    @Bean
    public DataSource dataSource() throws SQLException {
   
        DruidDataSource druidDataSource = new DruidDataSource();
        // 设定数据源的初始配置,
        druidDataSource.setUrl("jdbc:mysql://localhost:3306/phpdemo?characterEncoding=" +
                "utf8&serverTimezone=Asia/Shanghai&useSSL=false");
        druidDataSource.setUsername("root");
        druidDataSource.setPassword("root");
        druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        // 开启stat sql监控信息
        druidDataSource.setFilters("stat,wall");
        return druidDataSource;
    }


    // 配置druid的监控页
    @Bean
    public ServletRegistrationBean statViewServlet(){
   

        StatViewServlet statViewServlet = new StatViewServlet();
        // 配置自定义的servlet,以及要处理的请求响应
        ServletRegistrationBean<StatViewServlet> registrationBean =
                new ServletRegistrationBean<>(statViewServlet,"/druid/*");
        // 设定druid内置监控页面的登录账号密码信息
        registrationBean.addInitParameter("loginUsername","admin");
        registrationBean.addInitParameter("loginPassword","robin");
        // 设置禁止清空内置监控页面数据信息
        registrationBean.addInitParameter("resetEnable","false");
        return registrationBean;
    }


    // 配置WebStatFilter
    @Bean
    public FilterRegistrationBean webStatFilter(){
   
        WebStatFilter webStatFilter = new WebStatFilter();
        FilterRegistrationBean<WebStatFilter> registrationBean =
                new FilterRegistrationBean<WebStatFilter>(webStatFilter);
        // 设置拦截路径
        registrationBean.setUrlPatterns(Arrays.asList("/*"));
        // 设置放行路径
        registrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return registrationBean;
    }
}

项目结构:
在这里插入图片描述


导入stater配置druid数据源(推荐-简单方便使用)

使用第三方提供的stater配置数据源,相比自定义配置使用很简单

1.引入依赖

        <!-- jdbc stater-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!--   mysql驱动     -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>
        <!-- druid stater-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.17</version>
        </dependency>

2.编写application.yaml

首先将上面自定义的注释掉,使用stater的方式配置druid数据源,只需要引入依赖,然后修改application.yaml的配置信息即可,很方便。

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/phpdemo?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    druid:
      aop-patterns: com.robin.boot # 监控SpringBean
      filters: stat,wall # 开启sql监控和防火墙功能

      stat-view-servlet: #配置监控页功能
        enabled: true
        login-username: admin
        login-password: robin
        reset-enable: false # 禁用刷新重置按钮

      web-stat-filter: # 监控web
        enabled: true
        url-pattern: /*
        exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'

启动服务,用上面的controller进行测试,可以正确访问。


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
2月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
358 3
|
3月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
664 5
|
3月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
215 0
探索Spring Boot的@Conditional注解的上下文配置
|
4月前
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
1081 10
|
2月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。
|
2月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
2月前
|
JavaScript Java 关系型数据库
基于springboot的古树名木保护管理系统
本研究针对古树保护面临的严峻挑战,构建基于Java、Vue、MySQL与Spring Boot技术的信息化管理系统,实现古树资源的动态监测、数据管理与科学保护,推动生态、文化与经济可持续发展。
|
2月前
|
监控 安全 JavaScript
2025基于springboot的校车预定全流程管理系统
针对传统校车管理效率低、信息不透明等问题,本研究设计并实现了一套校车预定全流程管理系统。系统采用Spring Boot、Java、Vue和MySQL等技术,实现校车信息管理、在线预定、实时监控等功能,提升学校管理效率,保障学生出行安全,推动教育信息化发展。
|
2月前
|
人工智能 Java 关系型数据库
基于springboot的画品交流系统
本项目构建基于Java+Vue+SpringBoot+MySQL的画品交流系统,旨在解决传统艺术交易信息不透明、流通受限等问题,融合区块链与AI技术,实现画品展示、交易、鉴赏与社交一体化,推动艺术数字化转型与文化传播。

热门文章

最新文章