当前位置: 首页 > news >正文

Spring Boot整合Druid:轻松实现SQL监控和数据库密码加密

文章目录

  • 1 引言
    • 1.1 简介
    • 1.2 Druid的功能
    • 1.3 竞品对比
  • 2 准备工作
    • 2.1 项目环境
  • 3 集成Druid
    • 3.1 添加依赖
    • 3.2 配置Druid
    • 3.3 编写测试类测试
    • 3.4 访问控制台
    • 3.5 测试SQL监控
    • 3.6 数据库密码加密
      • 3.6.1 执行命令加密数据库密码
      • 3.6.2 配置参数
      • 3.6.3 测试
  • 4 总结

1 引言

1.1 简介

Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置Loging能诊断Hack应用行为。除了提供基本的数据源功能外,还具备以下优势:

  • 性能优越:Druid连接池的性能表现优于其他常见连接池,如C3P0和DBCP。
  • 监控功能强大:Druid内置了丰富的监控功能,可以实时查看SQL执行情况、连接池状态等。
  • 稳定性高:Druid在高并发环境下表现稳定,能够有效避免连接泄漏等问题。
  • 扩展性好:Druid支持多种数据库,且配置灵活,易于集成和扩展。

1.2 Druid的功能

  1. 高效的数据库连接池管理

    • 高性能:在并发环境下表现优越,处理大量数据库连接请求。

    • 稳定性:在高并发和高负载情况下保持稳定,避免连接泄漏。

    • 易用性:配置简单,快速集成到Java应用中。

  2. 丰富的监控功能

    • 连接池监控:实时监控连接池状态,如连接数、空闲连接数等。
    • SQL监控:记录SQL执行情况,统计执行时间、次数等。
    • URI监控:监控各URI的访问情况,统计请求次数和响应时间。
    • 防火墙功能:防止SQL注入攻击,提升系统安全性。
  3. 便捷的配置和扩展

    • 多数据库支持:支持MySQL、Oracle、PostgreSQL等多种数据库。

    • 灵活配置:提供丰富的配置选项,灵活调整。

    • 插件机制:支持插件扩展功能,如statwalllog4j等。

  4. SQL执行日志和统计分析

    • SQL执行日志:记录SQL执行时间、次数、影响行数等。

    • 统计分析:提供SQL执行统计分析,帮助优化SQL性能。

    • 慢SQL检测:自动检测慢SQL,提供详细执行信息,便于调优。

  5. 提高系统安全性

    • SQL防火墙:配置防火墙规则,拦截非法SQL请求,防止SQL注入。

    • 黑白名单机制:配置IP黑白名单,限制特定IP访问权限。

1.3 竞品对比

功能类别功能DruidHikariCPDBCPTomcat-jdbcC3P0
性能PSCache
LRU
SLB负载均衡支持
稳定性ExceptionSorter
扩展扩展FilterJdbcIntercepter
监控监控方式jmx/log/httpjmx/metricsjmxjmxjmx
支持SQL级监控
Spring/Web关联监控
诊断支持LogFilter
连接泄露诊断logAbandoned
安全SQL防注入
支持配置加密

2 准备工作

2.1 项目环境

  • JDK版本:JDK 17
  • Spring Boot版本:Spring Boot 3.2.2
  • MySQL版本:8.0.37
  • 构建工具:Maven

3 集成Druid

3.1 添加依赖

这里的Druid版本必须要选择1.2.20及以上版本,否则无法运行。

还有一点,Druid的版本要与mysql-connector-java的版本相匹配,可以去下面的网站看:

Maven Repository: com.alibaba » druid » 1.2.20 (mvnrepository.com)

        <dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.20</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.32</version></dependency>

3.2 配置Druid

相关配置的详细信息可见:DruidDataSource配置属性列表 · alibaba/druid Wiki (github.com)

spring:application:name: serverprofiles:active: dev # 激活dev配置文件datasource:url: jdbc:mysql://${voyager.db.host}:3306/study_db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghaidriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: ${voyager.db.pw}# druid 相关参数配置druid:# 初始化连接大小initial-size: 5# 最小连接池数量min-idle: 5# 最大连接池数量max-active: 20# 获取连接时最大等待时间,单位毫秒max-wait: 60000# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒time-between-eviction-runs-millis: 60000# 配置一个连接在池中最小生存的时间,单位是毫秒min-evictable-idle-time-millis: 300000# 测试连接validation-query: SELECT 1 FROM DUAL# 配置监控统计用的filters,过滤掉静态文件web-stat-filter:# 启用Web统计过滤器enabled: true# 过滤匹配规则url-pattern: /*# 过滤忽略的格式exclusions: /druid/*,*.js,*.css,*.gif,*.jpg,*.bmp,*.png,*.ico# 配置可视化控制台页面stat-view-servlet:enabled: true# 访问Druid监控页面的地址,首页默认是 /druid/index.htmlurl-pattern: /druid/*# 禁用重置按钮reset-enable: true# 登录用户名login-username: root# 登录密码login-password: 123456# 通过别名的方式配置扩展插件  常用的插件有:监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall 防御sql注入的filter:wallfilter:stat:enabled: true# 是否开启慢sqllog-slow-sql: true# 是否开启SQL合并merge-sql: true# 慢sql的时间标准 单位:毫秒slow-sql-millis: 1000

3.3 编写测试类测试

注意:不要使用lombok的@RequiredArgsConstructor注解,JUnit5好像无法自动装配,详情来自:

https://stackoverflow.com/questions/51867650/junit-5-no-parameterresolver-registered-for-parameter

@SpringBootTest
class SmartApplicationTest {@Autowiredprivate DataSource dataSource ;@Testvoid contextLoads() {System.out.println(dataSource.getClass());DruidDataSource druidDataSource = (DruidDataSource) dataSource;System.out.println("druidDataSource.getUrl() = " + druidDataSource.getUrl());System.out.println("druidDataSource.getUsername() = " + druidDataSource.getUsername());System.out.println("druidDataSource.getInitialSize() = " + druidDataSource.getInitialSize());System.out.println("druidDataSource.getMaxActive() = " + druidDataSource.getMaxActive());}}

运行测试:

image-20240624182524748

可以看到配置类的相关配置已经生效。

3.4 访问控制台

启动自己项目中的SpringBootApplication类后访问http://localhost:8084/druid/login.html(改为自己服务的端口),输入账号密码后即可进入:

image-20240624183006312

3.5 测试SQL监控

  1. 测试接口

    @RequestMapping("/user")
    @RestController
    @RequiredArgsConstructor
    public class UserInfoController {private final UserInfoService userInfoService;@GetMapping("/test")public Result<UserInfo> login() {return Result.success(userInfoService.getById(1));}}
    
  2. 进行测试

image-20240624183953241

3.6 数据库密码加密

3.6.1 执行命令加密数据库密码

官方教程Wiki文档:使用ConfigFilter · alibaba/druid Wiki (github.com)

在命令行中执行如下命令:

java -cp D:\Develop\Maven\mvnRespo\com\alibaba\druid\1.2.20\druid-1.2.20.jar com.alibaba.druid.filter.config.ConfigTools your_password

输出

privateKey:MIIBVgIBADANBgkqhkiG9w0BAQEFAASCAUAwggE8AgEAAkEA6+4avFnQKP+O7bu5YnxWoOZjv3no4aFV558HTPDoXs6EGD0HP7RzzhGPOKmpLQ1BbA5viSht+aDdaxXp6SvtMQIDAQABAkAeQt4fBo4SlCTrDUcMANLDtIlax/I87oqsONOg5M2JS0jNSbZuAXDv7/YEGEtMKuIESBZh7pvVG8FV531/fyOZAiEA+POkE+QwVbUfGyeugR6IGvnt4yeOwkC3bUoATScsN98CIQDynBXC8YngDNwZ62QPX+ONpqCel6g8NO9VKC+ETaS87wIhAKRouxZL38PqfqV/WlZ5ZGd0YS9gA360IK8zbOmHEkO/AiEAsES3iuvzQNYXFL3x9Tm2GzT1fkSx9wx+12BbJcVD7AECIQCD3Tv9S+AgRhQoNcuaSDNluVrL/B/wOmJRLqaOVJLQGg==
publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOvuGrxZ0Cj/ju27uWJ8VqDmY7956OGhVeefB0zw6F7OhBg9Bz+0c84RjzipqS0NQWwOb4kobfmg3WsV6ekr7TECAwEAAQ==
password:PNak4Yui0+2Ft6JSoKBsgNPl+A033rdLhFw+L0np1o+HDRrCo9VkCuiiXviEMYwUgpHZUFxb2FpE0YmSguuRww==

3.6.2 配置参数

spring:datasource:url: jdbc:mysql://${voyager.db.host}:3306/study_db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghaidriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: password  # 修改为控制台输出的password#druid数据源配置druid:# Druid数据源的公钥public-key: publicKey # 修改为控制台输出的publicKeyfilter:# 启用Druid的过滤器配置config: enabled: trueconnect-properties:# 启用Druid的连接属性解密功能config.decrypt: trueconfig.decrypt.key: publicKey # 控制台输出的publicKey

3.6.3 测试

启动启动类,请求测试接口:

image-20240624211333064

4 总结

在这篇文章中,我们详细介绍了如何在Spring Boot项目中集成Druid数据源,并实现SQL监控和数据库密码加密等功能,Druid还有许多有用的功能,这里就不过多展示了,希望本文对大家有所帮助😊。

相关文章:

  • 【前端】面试八股文——输入URL到页面展示的过程
  • 被⽹络罪犯利⽤的5⼤ChatGPT越狱提⽰
  • 浅谈Tomcat
  • FastGPT 手动部署错误:MongooseServerSelectionError: getaddrinfo EAI_AGAIN mongo
  • CSRF是什么攻击 该如何解决
  • 合同网协议实现无人机分布式任务分配的原理介绍和代码逻辑框架
  • 6月28日PolarDB开源社区长沙站,NineData联合创始人周振兴将带来《数据库DevOps最佳实践》主题分享
  • 深入探索 WebKit 的事件处理模型:机制与实践
  • 汽车IVI中控开发入门及进阶(三十三):i.MX linux开发之开发板
  • 【linux学习---1】点亮一个LED---驱动一个GPIO
  • 使用python做飞机大战
  • Android Service两种启动方式的区别
  • 无人机云台的类型及其作用
  • deepstream 6.2版本下载链接
  • 为什么我感觉 C 语言在 Linux 下执行效率比 Windows 快得多?
  • es6(二):字符串的扩展
  • learning koa2.x
  • leetcode46 Permutation 排列组合
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • PV统计优化设计
  • Python利用正则抓取网页内容保存到本地
  • tweak 支持第三方库
  • Vue2.x学习三:事件处理生命周期钩子
  • 从PHP迁移至Golang - 基础篇
  • 由插件封装引出的一丢丢思考
  • 鱼骨图 - 如何绘制?
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​批处理文件中的errorlevel用法
  • #{}和${}的区别是什么 -- java面试
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (arch)linux 转换文件编码格式
  • (二)WCF的Binding模型
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (全注解开发)学习Spring-MVC的第三天
  • (一)Linux+Windows下安装ffmpeg
  • (一)为什么要选择C++
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .net反编译的九款神器
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • @RequestBody与@ModelAttribute
  • [ 数据结构 - C++]红黑树RBTree
  • [android] 天气app布局练习
  • [C# 网络编程系列]专题六:UDP编程
  • [C#]使用OpenCvSharp图像滤波中值滤波均值滤波高通滤波双边滤波锐化滤波自定义滤波
  • [c]统计数字
  • [C++11 多线程同步] --- 条件变量的那些坑【条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)】
  • [cogs2652]秘术「天文密葬法」
  • [HackMyVM]靶场Boxing