spring boot学习(十二)整合Druid

2023-11-15

Druid简介

Java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池。

Druid 是阿里巴巴开源平台上一个数据库连接池实现,结合了 C3P0、DBCP 等 DB 池的优点,同时加入了日志监控。

Druid 可以很好的监控 DB 池连接和 SQL 的执行情况,天生就是针对监控而生的 DB 连接池。

Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。

Spring Boot 2.0 以上默认使用 Hikari 数据源,可以说 Hikari 与 Driud 都是当前 Java Web 上最优秀的数据源,我们来重点介绍 Spring Boot 如何集成 Druid 数据源,如何实现数据库监控。

Github地址:https://github.com/alibaba/druid/

com.alibaba.druid.pool.DruidDataSource 基本配置参数如下:
在这里插入图片描述

配置durid

添加上 Druid 数据源依赖。


<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.21</version>
</dependency>

切换数据源;之前已经说过 Spring Boot 2.0 以上默认使用 com.zaxxer.hikari.HikariDataSource 数据源,但可以 通过 spring.datasource.type 指定数据源。

spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource # 自定义数据源

durid可设置的参数


spring:
  datasource:
    username: root
    password: 123456
    #?serverTimezone=UTC解决时区的报错
    url: jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource

    #Spring Boot 默认是不注入这些属性值的,需要自己绑定
    #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

    #配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
    #如果允许时报错  java.lang.ClassNotFoundException: org.apache.log4j.Priority
    #则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j
    filters: stat,wall,log4j
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

导入Log4j 的依赖


<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

创建durid的配置进去
现在需要程序员自己为 DruidDataSource 绑定全局配置文件中的参数,再添加到容器中,而不再使用 Spring Boot 的自动生成了;我们需要 自己添加 DruidDataSource 组件到容器中,并绑定属性;

package com.zp.jdbc.demo.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import org.springframework.boot.context.properties.ConfigurationProperties;
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.util.HashMap;
import java.util.Map;

@Configuration
public class DruidConfig {

    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource druidDataSource() {
        return new DruidDataSource();
    }

    @Bean
    public ServletRegistrationBean statViewServlet() {
        ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
        Map<String, String> initParams = new HashMap<>();
        initParams.put("loginUsername", "admin"); //后台管理界面的登录账号
        initParams.put("loginPassword", "123456"); //后台管理界面的登录密码

        //后台允许谁可以访问
        //initParams.put("allow", "localhost"):表示只有本机可以访问
        //initParams.put("allow", ""):为空或者为null时,表示允许所有访问
        initParams.put("allow", "");
        //deny:Druid 后台拒绝谁访问
        //initParams.put("kuangshen", "192.168.1.20");表示禁止此ip访问

        //设置初始化参数
        bean.setInitParameters(initParams);
        return bean;
    }


}


配置Druid数据源监控

Druid 数据源具有监控的功能,并提供了一个 web 界面方便用户查看,类似安装 路由器 时,人家也提供了一个默认的 web 页面。

所以第一步需要设置 Druid 的后台管理页面,比如 登录账号、密码 等;配置后台管理;(注意statViewServlet的设置)

package com.zp.jdbc.demo.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import org.springframework.boot.context.properties.ConfigurationProperties;
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.util.HashMap;
import java.util.Map;

@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druidDataSource() {
    return new DruidDataSource();
}

@Bean
public ServletRegistrationBean statViewServlet() {
    ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
    Map<String, String> initParams = new HashMap<>();
    initParams.put("loginUsername", "admin"); //后台管理界面的登录账号
    initParams.put("loginPassword", "123456"); //后台管理界面的登录密码

    //后台允许谁可以访问
    //initParams.put("allow", "localhost"):表示只有本机可以访问
    //initParams.put("allow", ""):为空或者为null时,表示允许所有访问
    initParams.put("allow", "");
    //deny:Druid 后台拒绝谁访问
    //initParams.put("kuangshen", "192.168.1.20");表示禁止此ip访问

    //设置初始化参数
    bean.setInitParameters(initParams);
    return bean;
}

}

配置完毕后,我们可以选择访问 :http://localhost:8080/druid/login.html
`在这里插入图片描述
``

配置 Druid web 监控 filter 过滤器


//配置 Druid 监控 之  web 监控的 filter
//WebStatFilter:用于配置Web和Druid数据源之间的管理关联监控统计
@Bean
public FilterRegistrationBean webStatFilter() {
    FilterRegistrationBean bean = new FilterRegistrationBean();
    bean.setFilter(new WebStatFilter());

    //exclusions:设置哪些请求进行过滤排除掉,从而不进行统计
    Map<String, String> initParams = new HashMap<>();
    initParams.put("exclusions", "*.js,*.css,/druid/*,/jdbc/*");
    bean.setInitParameters(initParams);

    //"/*" 表示过滤所有请求
    bean.setUrlPatterns(Arrays.asList("/*"));
    return bean;
}

这个过滤器怎么注册可以看一下springboot学习(九)一个简单的项目以及国际化的处理里面最后的MyMvcConfig类里面的addInterceptors方法的这种方式。

PS:
问题:Failed to bind properties under ‘spring.datasource’ to javax.sql.DataSource:
这个是没有导入log4j的依赖导致的

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

spring boot学习(十二)整合Druid 的相关文章

随机推荐

  • java基础之 IO 流(InputStream/OutputStream)

    基流 上图中有句话写错了 应该是 字节流的根类 文件输出 入字节流 代码示例 心得 读写文件流 关心 读的时候读多少 写的时候写多少 它没有限制一次只能读 写多少 文件流的创建 到 文件流的关闭 为一个周期 package IOTest i
  • 肝2022世界杯,怒写企业级镜像私仓Docker+Harbor实践

    2022 12 09 揭幕2022卡塔尔世界杯4强角逐的第一天 越来越精彩了 同时记录程序猿的成长 1 背景 由于期望搭建一个企业级CICD的环境 开始尝试常规的gitlab jenkins k8s docker harbor spring
  • 997. 找到小镇的法官

    题目描述 小镇里有 n 个人 按从 1 到 n 的顺序编号 传言称 这些人中有一个暗地里是小镇法官 如果小镇法官真的存在 那么 小镇法官不会信任任何人 每个人 除了小镇法官 都信任这位小镇法官 只有一个人同时满足属性 1 和属性 2 给你一
  • 从0开始的 TypeScriptの十四:内置工具类型

    序 在之前的 从0开始的TypeScript 十三 中 已经对typescript的工具类型中的关键字infer extends keyof typeof in这些有所了解了 那么接下来为了使用更加方便 可以对typescript中内置的工
  • 【MATLAB】【函数介绍】cp2tform函数从控制点对推断空间变换

    官方链接 https ww2 mathworks cn help images ref cp2tform html s tid doc ta cp2tform函数的作用是根据传入的控制点对的坐标推断空间变换参数 函数语法如下 从控制点对推断
  • 【华为OD机试】服务失效判断【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 某系统中有众多服务 每个服务用字符串 只包含字母和数字 长度 lt 10 唯一标识 服务间可能有依赖关系 如A依赖B 则当B故障时导致A也故障 依赖具有传递性 如A依
  • QSettings修改配置文件的bug

    QT 使用QSettings类的bug 问题描述 原因分析 解决方案 问题描述 settings beginGroup mainwindow settings setValue size win gt size settings setVa
  • [转]shell中wait命令详解

    wait命令介绍 wait 作业指示或进程号 1 等待作业号或者进程号制定的进程退出 返回最后一个作业或进程的退出状态状态 如果没有制定参数 则等待所有子进程的退出 其退出状态为0 2 如果是shell中等待使用wait 则不会等待调用函数
  • Python 百分比计算

    遇到计算百分比的情况 查了一下 有两种方式 具体实现方式见下面代码 方式1 格式化为float 然后 处理成 格式 需要对分子 分母 100如下 percentList append 2f format member denominator
  • 51单片机蓝桥杯学习记录2独立按键

    51单片机蓝桥杯学习记录 独立按键这一块是比较简单的 就是读一下io口的高低电平 用普通函数写和用中断写还是有些不一样的 要注意的还是消抖和重复触发的问题 不说了 上码 author 风行天 time 2020 01 16 include
  • 初识云计算————虚拟化背景

    VM 虚拟机 Virtual Machine 虚拟化背景 美国环境保护署 EPA 报告的一组有趣的统计数据就证明了其好处 EPA 研究服务器和数据中心的能源效率时发现 实际上服务器只有 5 的时间是在工作的 在其他时间 服务器都处于 休眠
  • 字节和比特简单介绍

    字节 byte 字节为Byte 多数用B表示 字节为计算机中数据处理的基本单位 比特 bit 又称位 表示二进制位 为计算内部数据存储的最小单位 关系 1Byte 8bit 其他单位 1B Byte 字节 8bit 1KB Kilobyte
  • redis的数据类型string和list

    学习笔记记录 方便以后查看 一 Redis简介 1 关于关系型数据库和nosql数据库 关系型数据库是基于关系表的数据库 最终会将数据持久化到磁盘上 而nosql数据 库是基于特殊的结构 并将数据存储到内存的数据库 从性能上而言 nosql
  • 文献精讲-弱小目标检测-ADMD方法

    分享一下个人对于近期读过的一篇文献 Fast and robust small infrared target detection using absolute directional mean difference algorithm 的
  • Python打包的艺术(二)- Packaging Tools的昨天,今天,明天

    本文转载至 http blog chinaunix net uid 15174104 id 4036539 html 截至今年3月 Python的打包工具链处于的状态可以用 非常混乱 来形容 除了官方的distutils 第三方有setup
  • Python 包发布

    包结构 准备工作 twine 安装 pip3 install twine pypi 账号注册 https pypi org account register 注册成功后 记得到邮箱激活 否则无法使用 三个文件 setup py import
  • 【华为OD机试真题】MVP争夺战(python)100%通过率 超详细代码注释 代码解读

    华为OD机试真题 2022 2023 真题目录 点这里 华为OD机试真题 信号发射和接收 试读 点这里 华为OD机试真题 租车骑绿道 试读 点这里 MVP争夺战 知识点DFS搜索 时间限制 1s 空间限制 256MB 限定语言 不限 题目描
  • 【Java数据结构】Map和Set的使用

    章节目标 掌握Map Set及实际实现类 HashMap TreeMap HashSet TreeSet的使用 掌握 TreeMap 和 TreeSet 背后的数据结构搜索树的原理和简单实现 掌握 HashMap 和 HashSet 背后的
  • Ant Desgin Pro v6 正式版本企业级从零开始实现动态菜单与权限视频教程(28 个视频)

    Ant Desgin Pro v6 正式版本企业级从零开始实现动态菜单与权限视频教程 28 个视频 欢迎加入我们的Ant Design Pro v6视频教程 如果您正在寻找一门教您如何从零开始构建企业级动态菜单和权限管理的课程 那么这个视频
  • spring boot学习(十二)整合Druid

    Druid简介 Java程序很大一部分要操作数据库 为了提高性能操作数据库的时候 又不得不使用数据库连接池 Druid 是阿里巴巴开源平台上一个数据库连接池实现 结合了 C3P0 DBCP 等 DB 池的优点 同时加入了日志监控 Druid