Springboot 集成Druid

2023-11-06

Springboot 集成Druid

Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。本篇主要讲解一下 Springboot中如何集成 Druid !

image-20220722091607865

1.添加Druid依赖 

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

有不少教程建议的依赖是

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

其实Druid和Springboot官方已经提供了很好的集成,虽然二者都可以使用,但是druid-spring-boot-starter不需要编写配置类,简化了配置。 

2.添加配置application.yaml

spring:
  datasource:
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai
    type: com.alibaba.druid.pool.DruidDataSource
    # 数据源连接池配置
    druid:
      #   数据源其他配置
      initialSize: 5
      minIdle: 5
      maxActive: 20
      maxWait: 60000
      timeBetweenEvictionRunsMillis: 60000
      minEvictableIdleTimeMillis: 300000
      validationQuery: SELECT 1 FROM DUAL
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 20
      useGlobalDataSourceStat: true
      connectionProperties: druid.stat.mergeSql=true;druid.stat.logSlowSql=true;druid.stat.slowSqlMillis=1000;
      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
      filters: stat,wall,slf4j

      #配置监控属性: 在druid-starter的: com.alibaba.druid.spring.boot.autoconfigure.stat包下进行的逻辑配置
      # WebStatFilter配置,
      web-stat-filter:
        #默认为false,表示不使用WebStatFilter配置,就是属性名去短线
        enabled: true
        #拦截该项目下的一切请求
        url-pattern: /*
        #对这些请求放行
        exclusions: /druid/*,*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico
        session-stat-enable: true
        principal-session-name: session_name
        principal-cookie-name: cookie_name
      # StatViewServlet配置
      stat-view-servlet:
        #默认为false,表示不使用StatViewServlet配置,就是属性名去短线
        enabled: true
        #配置DruidStatViewServlet的访问地址。后台监控页面的访问地址
        url-pattern: /druid/*
        #禁用HTML页面上的“重置”功能,会把所有监控的数据全部清空,一般不使用
        reset-enable: false
        #监控页面登录的用户名
        login-username: admin
        #监控页面登录的密码
        login-password: 123456
        #白名单
        allow:
        #黑名单
        deny:
      #Spring监控配置,说明请参考Druid Github Wiki,配置_Druid和Spring关联监控配置
      aop-patterns: com.zzp.*

 有几个地方需要注意下:

  • 想要在日志中输出慢日志除了配置connectionProperties,还需要在filters属性中加入项目使用的日志框架如log4j或者slf4j,并引入对应依赖,否则日志中不会输出慢sql日志;
  • 如果需要Spring监控,除了配置aop-patterns,还需要加入spring-boot-starter-aop依赖,否则Spring监控页面空白。

3.查看监控页面

访问http://ip:port/druid/login.html,输入账号密码,如果数据源页面各项参数和配置的参数一样,则说明集成成功。

image.png

调用接口,查看SQL监控和Spring监控页面是否正常显示。 

4.去除广告

监控页面下方有阿里云的广告,可以通过代码去除。 

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
import com.alibaba.druid.util.Utils;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.*;
import java.io.IOException;

/**
 * Druid广告配置
 *
 * @author zzp
 */
@Configuration
@ConditionalOnWebApplication
@AutoConfigureAfter(DruidDataSourceAutoConfigure.class)
@ConditionalOnProperty(
        name = "spring.datasource.druid.stat-view-servlet.enabled",
        havingValue = "true",
        matchIfMissing = true)
public class DruidAdConfig {

    /**
     * 去除监控页面底部广告
     *
     * @param properties
     * @return org.springframework.boot.web.servlet.FilterRegistrationBean
     */
    @Bean
    public FilterRegistrationBean removeDruidAdFilterRegistrationBean(
            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(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("<a.*?banner\"></a><br/>", "");
                        text = text.replaceAll("powered.*?shrek.wang</a>", "");
                        response.getWriter().write(text);
                    }

                    @Override
                    public void destroy() {}
                };
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(filter);
        registrationBean.addUrlPatterns(commonJsPattern);
        return registrationBean;
    }
}

完结! 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springboot 集成Druid 的相关文章

  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • 如何在 Spring-JUnit 测试中设置 JNDI 查找?

    我正在使用 Maven 3 0 3 Spring 3 1 0 RELEASE 和 JUnit 4 8 1 如何在容器外部创建 JNDI 功能 在我的例子中是 JBoss 我认为 Spring 的 jndiTemplate 可以解决这个问题
  • 如何在 Spring 中禁用使用 @Component 注释创建 bean?

    我的项目中有一些用于重构逻辑的通用接口 它看起来大约是这样的 public interface RefactorAwareEntryPoint default boolean doRefactor if EventLogService wa
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • 当 OnFocusChangeListener 应用于包装的 EditText 时,TextInputLayout 没有动画

    不能比标题说得更清楚了 我有一个由文本输入布局包裹的 EditText 我试图在 EditText 失去焦点时触发一个事件 但是 一旦应用了事件侦听器 TextInputLayout 就不再对文本进行动画处理 它只是位于 editText
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 非 Spring 托管类中 DI 的编译时编织

    我想为标记为的类配置编译时编织 Configurable注释能够将 spring 依赖项注入到初始化的类中new操作员 我不想使用加载时编织 因为我无权访问应用程序服务器的运行脚本 因此无法修改它 另外 我希望能够在测试中使用此类 我的意思
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp
  • Java中super关键字的范围和使用

    为什么无法使用 super 关键字访问父类变量 使用以下代码 输出为 feline cougar c c class Feline public String type f public Feline System out print fe

随机推荐

  • 推荐几个可以写到简历上的Go方向优质开源项目(需花点心思研究)

    前言 哈喽 大家好 我是asong 最近总有读者问我有没有Go语言方向优质的开源项目 可以写在简历上那种 一时还真想不起来 花了两天时间调研了一下 针对有无工作经验的分别推荐几个开源项目 下面我们一起来看一下 无工作经验 对于还在上学的朋友
  • java中怎么从一个数组中截取一定长度的元素放到新数组中

    可以直接用Arrays的静态方法copyOfRange int original int from int to 下面是一个简单的演示程序 1 2 3 4 5 6 7 8 9 10
  • mysql Navicat12约束条件的设置和详解

    文章目录 一 什么是mysql约束条件 1 1 说明 1 2 约束的分类 二 Navicat对应约束的设置位置 2 1 not null 非空约束 primary key 主建约束 default 默认约束 2 2 unique 唯一 2
  • OpenBSD 加速 下载安装

    OpenBSD 安装后需要安装其它软件时候 发现它要自动下载源文件 要不就手动下载 反正就是慢 我发现有个方法可以加快自动安装时候的下载 su root cat gt gt etc mk conf DISTDIR usr files dis
  • 字符串一次编辑

    一次编辑 字符串有三种编辑操作 插入一个字符 删除一个字符或者替换一个字符 给定两个字符串 编写一个函数判定它们是否只需要一次 或者零次 编辑 作者 LeetCode Solution 链接 https leetcode cn proble
  • linux搭建ftp

    ftp一些概念了解 Linux安装vsftpd及配置详解 1 安装 yum y install vsftpd 2 FTP主动模式与FTP被动模式 3 防火墙开启21端口 文中是使用iptables开启的 现在centos7 2版本默认是防火
  • 对el-form-item中的子组件进行必填验证(方法)

    效果图 思路 在el form item中添加show message属性 每次修改子组件值时 对其进行判断修改 部分代码
  • 光通量,光强,亮度,照度

    1 光通量 F 单位时间通过的光量 单位 流明 lm 2 发光强度 光强 I 单位立体角的光通量 I F 单位 坎德拉 cd 3 亮度 L 单位面积光强 L I S sin 单位 坎德拉 平米 cd 4 照度 E 单位面积接受的光通量 E
  • 固定分区存储空间的分配和回收Java代码实现

    目录 一 实验要求 二 实验目的 三 源代码 四 实验结果 五 实验总结 一 实验要求 实现固定分区存储管理方式下存储空间的分配和回收 已知当前内存分配表如下 分区号 起始地址 长度 状态 1 10KB 30KB Job5 2 40KB 7
  • 已知一个整数,如何判断这个整数是无符号的?

    前言 记录6月11日 肯哥在群里面分享的一个问题 说实话 看到题目想了半天没明白 一看答案 才发现 这题真的简单 题目 已知一个整数 如何判断这个整数是无符号的 题解 1 因为我的思路完全是错误的 我就不再此进行乱分析了 肯哥给出的提示是
  • 多维时序

    多维时序 MATLAB实现基于贝叶斯线性回归 Bayesian Regression 的多变量输入回归预测 目录 多维时序 MATLAB实现基于贝叶斯线性回归 Bayesian Regression 的多变量输入回归预测 预测效果 基本介绍
  • harbor 中 使用 push 上传镜像时候 显示 没有认证

    harbor 中 使用 upload 上传镜像时候 显示 没有认证 概述 VMware harbor 安装完成后 使用docker tag 打新的标签 然后 用docker push上传镜像的时候 显示 安全方面的错误 1 客户端显示信息
  • 数据结构知识点总结

    说明 1 本文档为作者考研准备数据结构时期所作笔记 所用资料为王道视频 2 文中少部分内容来源 王道数据结构笔记 3 文中部分图片 文字内容来源于互联网 4 文中一些示例图片由作者绘制 出现错误难以避免 如发现错误 欢迎指出 5 根据网友的
  • 在VREP的模型脚本中使用其他脚本的函数

    VREP是一款用于机器人仿真的软件 最近博主也正在使用此款软件完成机器人工控课程设计 VREP使用的是Lua语言编程的 Lua语言是嵌入式语言 十分方便简单 有C C 语言基础很容易上手 此次工控设计是关于youbot小车在迷宫中寻找随机生
  • 共识算法比较:Tendermint的BFT与EOS的dPoS

    这项技术深入研究由Chjango Unchained编写 本文比较了不同的共识系统 它们为EOS和Tendermint提供了关于每种基础技术以及它们有什么样的独特地类似证明 PoS 能力 在由单个组织运行的传统分布式系统中 信任和安全由防火
  • Windows下安装使用SVN

    Windows下安装使用SVN https www cnblogs com sns007 p 5769393 html
  • Git 学习(二)—— 工作区 — 本地仓库的操作命令

    我们要上传文件到本地仓库 不是直接拷贝进去的 而是需要通过命令一步步上传 从工作区到本地仓库分为了三步 也可以说是三个区域 目录 1 操作命令 1 git init 获取本地仓库 2 git add 工作区 暂存区 3 git commit
  • 关于distcc安装和使用

    distcc a fast free distributed C C compiler NEWS distcc 3 1 released Distcc release 3 1 is now available at Downloads Se
  • java 是怎么在中删除下拉列表_删除在一个下拉列表字段中选择的选项,并且不显示在该行中存在的其他下拉列表中不工作-jquery...

    我有一个包含多列的html表 在两列中我显示下拉列表 当用户从一个下拉列表中选择值时 选择Product1或Select Product2下拉列表 我想删除在一个下拉列表中选择的选项 并且不要在另一个下拉列表中显示该选项 下面的示例代码适用
  • Springboot 集成Druid

    Springboot 集成Druid Druid是Java语言中最好的数据库连接池 Druid能够提供强大的监控和扩展功能 本篇主要讲解一下 Springboot中如何集成 Druid 1 添加Druid依赖