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

简介: 这篇文章介绍了如何在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进行测试,可以正确访问。


相关文章
|
9天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
6天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2501 14
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
6天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1517 14
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
8天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
523 12
|
1月前
|
运维 Cloud Native Devops
一线实战:运维人少,我们从 0 到 1 实践 DevOps 和云原生
上海经证科技有限公司为有效推进软件项目管理和开发工作,选择了阿里云云效作为 DevOps 解决方案。通过云效,实现了从 0 开始,到现在近百个微服务、数百条流水线与应用交付的全面覆盖,有效支撑了敏捷开发流程。
19282 30
|
1月前
|
人工智能 自然语言处理 搜索推荐
阿里云Elasticsearch AI搜索实践
本文介绍了阿里云 Elasticsearch 在AI 搜索方面的技术实践与探索。
18836 20
|
1月前
|
Rust Apache 对象存储
Apache Paimon V0.9最新进展
Apache Paimon V0.9 版本即将发布,此版本带来了多项新特性并解决了关键挑战。Paimon自2022年从Flink社区诞生以来迅速成长,已成为Apache顶级项目,并广泛应用于阿里集团内外的多家企业。
17523 13
Apache Paimon V0.9最新进展
|
8天前
|
人工智能 自动驾驶 机器人
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
过去22个月,AI发展速度超过任何历史时期,但我们依然还处于AGI变革的早期。生成式AI最大的想象力,绝不是在手机屏幕上做一两个新的超级app,而是接管数字世界,改变物理世界。
452 48
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
|
22小时前
|
云安全 存储 运维
叮咚!您有一份六大必做安全操作清单,请查收
云安全态势管理(CSPM)开启免费试用
352 4
叮咚!您有一份六大必做安全操作清单,请查收
|
2天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。