Spring Boot 3.x 整合 Druid 数据库连接池(含密码加密)

Spring Boot 3.x 整合 Druid 数据库连接池(含密码加密)

1. 为什么需要数据库连接池?

在传统的数据库连接中,每一次与数据库连接都会消耗大量的系统资源和时间。数据库连接池会提前创建一定数量的数据库连接保存在池中,用来复用,避免了重复建立连接和关闭连接的开销

优点:

  • **提高性能和效率:**可以复用连接,减少建立连接的开销
  • 资源管理:可以限制连接数量,防止数据库连接过大导致资源不足
  • 连接复用:数据库连接池可以管理连接的生命周期,确保连接在需要时处于可用状态,并在不再需要时释放资源,从而减少了系统资源的浪费
  • 连接池监控:数据库连接池通常提供了监控和管理功能,可以实时监控连接的使用情况、连接的状态和性能指标

2. 什么是 Druid 连接池?

Druid 是阿里巴巴开源的一个高性能的数据库连接池,GitHub 地址:https://github.com/alibaba/druid 。它不仅提供了传统数据库连接池的连接管理功能,还提供了一系列强大的监控和扩展功能。Druid 的优势主要体现在以下几个方面:

  • 高性能:Druid 是基于 Java 平台开发的,使用了高效的连接池算法和多线程技术,能够提供高性能的数据库连接管理服务。
  • 丰富的监控功能:Druid 提供了丰富的监控功能,包括连接池状态监控、SQL 执行性能监控、SQL 执行分析等,可以实时监控数据库连接的使用情况和性能指标,并生成详细的报表和图表。
  • 安全性:Druid 内置了防 SQL 注入功能和黑名单功能,能够有效防止恶意 SQL 注入攻击和非法访问。
  • 灵活的配置:Druid 提供了丰富的配置选项,可以灵活地配置连接池的参数和行为,满足不同场景下的需求。
  • 可扩展性:Druid 提供了插件机制,支持自定义插件和扩展功能,开发人员可以根据需要自定义监控指标、扩展连接池的功能等。
  • 完善的文档和社区支持:Druid 有完善的官方文档和活跃的社区支持,开发人员可以方便地获取帮助和解决问题。

3. 开始整合

3.1 添加依赖

 <properties>druid.version>1.2.21</druid.version></properties><dependencyManagement><dependencies><!-- Druid 数据库连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>${druid.version}</version></dependency></dependencies></dependencyManagement>

3.2 连接池配置

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driver # 指定数据库驱动类# 数据库连接信息url: jdbc:mysql://127.0.0.1:3306/xiaohashu?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghaiusername: root # 数据库用户名password: 123456 # 数据库密码type: com.alibaba.druid.pool.DruidDataSourcedruid: # Druid 连接池initial-size: 5 # 初始化连接池大小min-idle: 5 # 最小连接池数量max-active: 20 # 最大连接池数量max-wait: 60000 # 连接时最大等待时间(单位:毫秒)test-while-idle: truetime-between-eviction-runs-millis: 60000 # 配置多久进行一次检测,检测需要关闭的连接(单位:毫秒)min-evictable-idle-time-millis: 300000 # 配置一个连接在连接池中最小生存的时间(单位:毫秒)max-evictable-idle-time-millis: 900000 # 配置一个连接在连接池中最大生存的时间(单位:毫秒)validation-query: SELECT 1 FROM DUAL # 配置测试连接是否可用的查询 sqltest-on-borrow: falsetest-on-return: falsepool-prepared-statements: falseweb-stat-filter:enabled: truestat-view-servlet:enabled: trueurl-pattern: /druid/* # 配置监控后台访问路径login-username: admin # 配置监控后台登录的用户名、密码login-password: adminfilter:stat:enabled: truelog-slow-sql: true # 开启慢 sql 记录slow-sql-millis: 2000 # 若执行耗时大于 2s,则视为慢 sqlmerge-sql: truewall: # 防火墙config:multi-statement-allow: true

解释一下上面各项配置,都是干啥的:

  1. type: com.alibaba.druid.pool.DruidDataSource:指定使用 Druid 连接池。
  2. initial-size:初始化连接池大小,即连接池启动时创建的初始化连接数。
  3. min-idle:最小连接池数量,连接池中保持的最小空闲连接数。
  4. max-active:最大连接池数量,连接池中允许的最大活动连接数。
  5. max-wait:连接时最大等待时间,当连接池中的连接已经用完时,等待从连接池获取连接的最长时间,单位是毫秒。
  6. test-while-idle:连接空闲时是否执行检查。
  7. time-between-eviction-runs-millis:配置多久进行一次检测,检测需要关闭的连接,单位是毫秒。
  8. min-evictable-idle-time-millis:一个连接在连接池中最小生存的时间,单位是毫秒。
  9. max-evictable-idle-time-millis:一个连接在连接池中最大生存的时间,单位是毫秒。
  10. validation-query:测试连接是否可用的查询 SQL。
  11. test-on-borrow:连接从连接池获取时是否测试连接的可用性。
  12. test-on-return:连接返回连接池时是否测试连接的可用性。
  13. pool-prepared-statements:是否缓存 PreparedStatement,默认为 false。
  14. web-stat-filter:用于配置 Druid 的 Web 监控功能。在这里,enabled 表示是否开启 Web 监控功能。如果设置为 true,就可以通过浏览器访问 Druid 的监控页面。
  15. stat-view-servlet:配置 Druid 的监控后台访问路径、登录用户名和密码。
    • enabled 表示是否开启监控后台功能。
    • url-pattern 指定了监控后台的访问路径,即通过浏览器访问监控页面时的 URL。
    • login-usernamelogin-password 分别指定了监控后台的登录用户名和密码,用于访问监控后台时的身份验证。
  16. filter:用于配置 Druid 的过滤器,包括统计过滤器和防火墙过滤器。
    • stat:配置 Druid 的统计过滤器。enabled 表示是否开启统计功能,log-slow-sql 表示是否开启慢 SQL 记录,slow-sql-millis 指定了执行时间超过多少毫秒的 SQL 语句会被认为是慢 SQL,merge-sql 表示是否开启 SQL 合并功能。
    • wall:配置 Druid 的防火墙过滤器。防火墙用于防止 SQL 注入攻击。在这里,config 配置了防火墙的规则,multi-statement-allow 表示是否允许执行多条 SQL 语句。

3.4 监控后台

重启认证服务,访问地址:http://localhost:8080/druid ,即可登录 Druid 监控后台, 如下图所示,用户名和密码填写刚刚 yml 文件中手动配置的:

4. 数据库密码加密

数据库连接密码加密是为了增强系统的安全性。在配置文件中,明文存储数据库连接密码存在以下几个潜在风险:

  • 泄露风险: 如果配置文件被不当地公开或者泄露,其中包含的数据库连接密码也会暴露给不可信的第三方,从而造成数据库的安全威胁。
  • 权限滥用: 如果系统中的某个用户拥有访问配置文件的权限,那么他就可以直接获取到数据库连接密码。如果这个用户是不可信的,就有可能滥用这个权限,对数据库进行非法操作。
  • 审计追踪: 明文存储密码会降低系统的审计追踪能力。一旦出现安全问题,无法准确追踪是谁在何时何地使用了数据库连接密码。

为了避免以上风险,我们可以采取数据库连接密码加密的方式。加密后的密码可以在配置文件中存储,即使被泄露也不会直接暴露真实的密码,增加了攻击者破解密码的难度。

4.2 Druid 内置工具加密密码

接下来,我们将通过 Druid 内置的密码加密工具 ConfigTools,来对明文密码进行加密处理。新建一个 DruidTests 单元测试

import com.alibaba.druid.filter.config.ConfigTools;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
@Slf4j
class DruidTests {/*** Druid 密码加密*/@Test@SneakyThrowsvoid testEncodePassword() {// 你的密码String password = "123456";String[] arr = ConfigTools.genKeyPair(512);// 私钥log.info("privateKey: {}", arr[0]);// 公钥log.info("publicKey: {}", arr[1]);// 通过私钥加密密码String encodePassword = ConfigTools.encrypt(arr[0], password);log.info("password: {}", encodePassword);}}

解释一下上述代码:

  1. String password = "123456";:定义了要加密的密码。

  2. String[] arr = ConfigTools.genKeyPair(512);:调用 ConfigTools 类的 genKeyPair 方法生成 RSA 密钥对。RSA 是一种非对称加密算法,512 表示密钥长度为 512 位。

  3. log.info("privateKey: {}", arr[0]);log.info("publicKey: {}", arr[1]);:分别打印生成的私钥和公钥。私钥用于加密,公钥用于解密。

  4. String encodePassword = ConfigTools.encrypt(arr[0], password);:调用 ConfigTools 类的 encrypt 方法,使用生成的私钥对密码进行加密。这里将生成的私钥和密码作为参数传入,返回加密后的密码。

  5. log.info("password: {}", encodePassword);:打印加密后的密码。

    在这里插入图片描述

4.3 配置加密后的密码

接下来,编辑 applicaiton-dev.yml 文件,配置密码加密相关配置,如下图标注所示:

在这里插入图片描述

spring:datasource:// 省略...password: A2qT03X7KlL4v/F2foD6kV/Ch9gpNBWOh1qoCywanjv1AsI7f9x3iAyR9NkUKeV+FMo+halCTzy5Llbk2VOrVQ== # 数据库密码type: com.alibaba.druid.pool.DruidDataSourcedruid: # Druid 连接池// 省略...connectionProperties: config.decrypt=true;config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIaJmhsfN14oM+bghiOfARP6YgIiArekviyAOEa9Dt8spf4W38kSJShGs0NkzT3btqJB0O2o0X/yfVE8kqme1jMCAwEAAQ==// 省略...filter:config:enabled: true// 省略...

解释一下上述配置项:

  1. password: A2qT03X7KlL4v/F2foD6kV/Ch9gpNBWOh1qoCywanjv1AsI7f9x3iAyR9NkUKeV+FMo+halCTzy5Llbk2VOrVQ==:这里的密码改为加密后的密码。
  2. connectionProperties: config.decrypt=true;config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIaJmhsfN14oM+bghiOfARP6YgIiArekviyAOEa9Dt8spf4W38kSJShGs0NkzT3btqJB0O2o0X/yfVE8kqme1jMCAwEAAQ==:这里配置了连接属性,其中 config.decrypt=true 表示开启密码解密功能,config.decrypt.key 是用于解密的密钥,即上面单元测试生成公钥。在 Druid 连接池中,如果我们的密码已经经过了加密处理,就需要在连接属性中配置解密相关的参数,以便 Druid 能够正确解密密码,然后连接到数据库。
  3. filter.config.enabled: true:这里配置了 Druid 连接池的 filter,其中 config 是一个配置项,enabled: true 表示开启该配置项。这个配置项通常用于配置 Druid 连接池的一些额外功能,比如密码解密等。

如果我们的密码已经经过了加密处理,就需要在连接属性中配置解密相关的参数,以便 Druid 能够正确解密密码,然后连接到数据库。
3. filter.config.enabled: true:这里配置了 Druid 连接池的 filter,其中 config 是一个配置项,enabled: true 表示开启该配置项。这个配置项通常用于配置 Druid 连接池的一些额外功能,比如密码解密等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/884328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

完美解决“找不到MSVCR110.dll无法继续执行代码

msvcr110.dll是一个动态链接库&#xff08;Dynamic Link Library&#xff0c;简称DLL&#xff09;文件&#xff0c;它是Microsoft Visual C 2012 Redistributable Package的一部分。这个库文件包含了大量预先编写的函数和资源&#xff0c;用于支持那些使用Visual C 2012或与之兼…

C++【string的模拟实现】

在前文我们讲解了string类接口使用&#xff08;C【string类的使用】(上),C【string类的使用】&#xff08;下&#xff09;&#xff09;&#xff0c;本片文章就来模拟实现string类。 注&#xff1a;本文实现的是string的部分重点内容&#xff0c;目的是为了更好的了解string&…

新能源汽车充电设施在储充电站的应用

0引言 全球能源和环境问题促使新能源汽车受到关注&#xff0c;但其推广受充电设施和能源供应限制。光伏站、储能站和电动汽车充放电站作为可再生能源利用和储存方式&#xff0c;具有巨大潜力。本研究旨在探索新能源汽车充电设施与这些站点的融合模式&#xff0c;以支持新能源汽…

uniapp开发小程序【简单的实现点击下拉选择性别功能】

一、展示效果 二、代码 <template><view><view class="form_box"><view class="item"

Git 基础详解

1. 基本概念 Git是一个免费、开源的 分布式版本控制系统&#xff0c;可以高效处理小到大型的各种项目。 1.1 版本控制 版本控制&#xff1a;它是一种用于追踪和记录文件、目录、项目或软件的变化&#xff0c;以便将来查阅、比较、修订不同版本文件的系统 版本控制系统&…

Yarn介绍 | 组成 | 工作流程

1、理论 Apache YARN&#xff08;Yet another Resource Negotiator的缩写&#xff09;是Hadoop集群的资源管理系统&#xff0c;负责为计算程序提供服务器计算资源&#xff0c;相当于一个分布式的操作系统平台&#xff0c;而MapReduce等计算程序则相当于运行于操作系统之上的应用…

uniapp开发【选择地址-省市区功能】,直接套用即可

一、效果展示 二、代码 <template><view><view class="user_info"><view class="item"

《Web性能权威指南》-WebRTC-读书笔记

本文是《Web性能权威指南》第四部分——WebRTC的读书笔记。 第一部分——网络技术概览&#xff0c;请参考网络技术概览&#xff1b; 第二部分——无线网络性能&#xff0c;请参考无线网络性能&#xff1b; 第三部分——HTTP&#xff0c;请参考HTTP&#xff1b; 第四部分——浏览…

高效水电管理:Spring Boot在大学城的应用

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理大学城水电管理系统的相关信息成为必然。开…

(linux驱动学习 - 12). IIC 驱动实验

目录 一.IIC 总线驱动相关结构体与函数 1.i2c_adapter 结构体 2.i2c_algorithm 结构体 3.向系统注册设置好的 i2c_adapter 结构体 - i2c_add_adapter 4.向系统注册设置好的 i2c_adapter 结构体 - i2c_add_numbered_adapter 5.删除 I2C 适配器 - i2c_del_adapter 二.IIC 设…

selenium操作已开启的浏览器,方便调试

一、谷歌浏览器配置&#xff1a; 在所安装的谷歌下面&#xff0c;执行下面命令&#xff0c;打开谷歌浏览器&#xff0c;用来selenium的操作&#xff1a; 注意事项&#xff1a;端口需要不被占用&#xff0c;--user-data-dir"D:\workspace\chrome-data"这个路径需要有…

特殊矩阵的压缩存储

一维数组的存储结构 ElemType arr[10]; 各数组元素大小相同&#xff0c;且物理上连续存放。 数组元素a[i]的存放地址 LOC i * sizeof(ElemType)。&#xff08;LOC为起始地址&#xff09; 二维数组的存储结构 ElemType b[2][4];二维数组也具有随机存取的特性&#xff08;需…

河南高校大数据实验室建设案例分享

泰迪智能科技在与中国各地高校的合作中积累了丰富的经验&#xff0c;尤其是在大数据和人工智能领域。过去多年里与河南省内多所高校在大数据领域进行了积极的探索和建设&#xff0c;形成了一系列具有特色的大数据实验室。这些实验室不仅促进了高校内部的科研创新&#xff0c;也…

qt QPicture详解

1、概述 QPicture类是Qt框架中的一个重要图形类&#xff0c;它主要用于记录和回放QPainter的绘图指令。这个类能够跨平台、无分辨率依赖地绘制图形&#xff0c;非常适合用于实现打印预览和图像操作等场景。QPicture可以将绘图操作序列化为一种独立于平台的格式&#xff0c;保存…

获取vue.config.js里代理的路径

vue.config.js 主要用于配置 Vue CLI 的构建和开发服务器选项&#xff0c;不能直接拿到里面的值&#xff0c;如果是自己重新写的config&#xff0c;引入到页面就可以拿到 下面说&#xff0c;我的解决办法&#xff0c;如果有更好的&#xff0c;一定要给我说啊 在public目录下创…

【数据结构】宜宾大学-计院-实验六

实验 6 栈和队列&#xff08;综合实验&#xff09; 实验目的&#xff1a;实验内容&#xff1a;进制转换问题&#xff1a;第1题测试结果&#xff1a;第1题代码实现&#xff1a; 括号匹配问题&#xff1a;第2题测试结果&#xff1a;第2题代码实现&#xff1a; 回文字符串问题&…

LabVIEW for Linux 介绍

LabVIEW for Linux 介绍 1. 兼容性 LabVIEW for Linux 设计用于多种 Linux 发行版&#xff0c;包括 CentOS、Ubuntu 等。在安装之前&#xff0c;务必检查与您特定发行版版本的兼容性。 2. 程序移植 可移植性&#xff1a;在许多情况下&#xff0c;LabVIEW 程序&#xff08;VI…

《Python游戏编程入门》注-第4章2

《Python游戏编程入门》的“4.2.2 键盘事件”中介绍了通过键盘事件来监听键盘按键的方法。 1 键盘事件 玩家点击键盘中某个按键实际上包含了两个动作&#xff1a;点击按键和释放按键&#xff0c;也就是按键按下和松开。按键按下的对应的事件是KEYDOWN&#xff0c;按键松开对应…

递归到分治

一、递归与分治&#xff1a; 1、递归&#xff1a;如果一个问题分可以简化为某些更小的、更简单的子问题来解决&#xff0c;那么可以用递归 2、分治&#xff1a;如果想并行处理&#xff0c;可以用到分治 二、假设我们有一段文本&#xff0c;需要统计每个单词出现的频率。我们将…

数据结构(8.5_2)——基数排序

基数排序 第一趟“分配”&#xff1a;按"个位"进行分配 第一趟“收集”&#xff1a; 第二趟“分配”&#xff1a;按"十位"进行分配("个位"越大的越先入队) 第二趟“收集”&#xff1a; 第三趟“分配”&#xff1a;按"百位"进行分配(&…