Druid连接池学习

简介: Druid学习笔记,使用Druid进行密码加密。参考文档:https://github.com/alibaba/druid

什么是Druid连接池

Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置Loging能诊断Hack应用行为。Druid 的优点主要有以下几个方面:

  • 稳定性
  • 为监控而生
  • 诊断支持
  • 防SQL注入

稳定性特性

稳定性是数据库连接池最关键的特性,由于设计并发和数据库系统的交互,稳定性需要由内置稳定保障机制和长时间大规模验证来保证

内置经过长期反馈验证过的ExceptionSorter。在数据库服务器重启、网络抖动、连接被服务器关闭等异常情况下,连接发生了不可恢复异常,将连接从连接池中移除,保证连接池在异常发生情况下正常工作,是连接池稳定的关键特性。
错误提示:当连接不够用时,申请链接超时报错,Druid连接池能够报错会告诉你当前RunningSQL有哪些,当前连接池的水平信息。通过错误日志很方便知道系统瓶颈在哪里。

为监控而生

Druid连接池最初就是为监控系统采集jdbc运行信息而生的

  • Druid连接池的监控信息主要是通过StatFilter 采集的,采集的信息非常全面,包括SQL执行、并发、慢查、执行时间区间分布等。
  • Druid连接池内置了能和Spring/Servlet关联监控的实现,使得监控Web应用特别方便
  • Druid连接池内置了一个监控页面,提供了非常完备的监控信息,可以快速诊断系统的瓶颈。
  • 监控不影响性能,Druid增加StatFilter之后,能采集大量统计信息,同时对性能基本没有影响。StatFilter对CPU和内存的消耗都极小,对系统的影响可以忽略不计。监控不影响性能是Druid连接池的重要特性。

诊断支持

Druid连接池内置了LogFilter,将Connection/Statement/ResultSet相关操作的日志输出,可以用于诊断系统问题,也可以用于Hack一个不熟悉的系统。
LogFilter可以输出连接申请/释放,事务提交回滚,Statement的Create/Prepare/Execute/Close,ResultSet的Open/Next/Close,通过LogFilter可以详细诊断一个系统的Jdbc行为。

防SQL注入

SQL注入攻击是黑客对数据库进行攻击的常用手段,Druid连接池内置了WallFilter 提供防SQL注入功能,在不影响性能的同时防御SQL注入攻击。

  • 基于语意的防SQL注入:Druid连接池内置了一个功能完备的SQL Parser,能够完整解析mysql、sql server、oracle、postgresql的语法,通过语意分析能够精确识别SQL注入攻击。
  • 极低的漏报率和误报率:基于SQL语意分析,大量应用和反馈,使得Druid的防SQL注入拥有极低的漏报率和误报率。
  • 防注入对性能影响极小:内置参数化后的Cache、高性能手写的Parser,使得打开防SQL注入对应用的性能基本不受影响。

druid-spring-boot-3-starter的使用

Druid Spring Boot Starter 用于帮助你在Spring Boot项目中轻松集成Druid数据库连接池和监控。

如何使用

在Spring Boot项目中添加>druid-spring-boot-3-starter依赖

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

添加配置

spring:
  datasource:
    # driver-class-name 非必填可根据url推断
    driver-class-name: com.mysql.cj.jdbc.Driver
    # 只有下面三个是必填项(使用内嵌数据库的话这三个也可以不用填,会使用默认配置),其他配置不是必须的
    url: jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: root
    druid: # druid连接池
      initial-size: 2 # 初始化大小
      max-active: 30 # 最大连接池数量
      min-idle: 2 # 最小连接池数量
      max-wait: 1234 # 连接时最大等待时间(单位:毫秒)
      pool-prepared-statements: true # 是否缓存 PreparedStatement,默认为 false
      max-pool-prepared-statement-per-connection-size: 5
      # max-open-prepared-statements: #等价于上面的max-pool-prepared-statement-per-connection-size
      validation-query: select 1 # 配置测试连接是否可用的查询 sql
      validation-query-timeout: 1
      test-on-borrow: true # 连接从连接池获取时是否测试连接的可用性
      test-on-return: true # 连接返回连接池时是否测试连接的可用性。
      test-while-idle: true # 连接空闲时是否执行检查。
      time-between-eviction-runs-millis: 10000 # 配置多久进行一次检测,检测需要关闭的连接,单位是毫秒。
      min-evictable-idle-time-millis: 30001 # 一个连接在连接池中最小生存的时间,单位是毫秒。
      async-close-connection-enable: true
      # 监控配置
      # WebStatFilter配置,说明请参考Druid Wiki,配置_配置WebStatFilter
      # https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_%E9%85%8D%E7%BD%AEWebStatFilter
      web-stat-filter:
        enabled: true # 启动 StatFilter
        # url-pattern:  # 指定过滤url 例:/*   过滤所有url
        # exclusions: # 排除一些不必要的url 例:"*.gif,*.jpg,*.png"
        session-stat-enable: # 开启session统计功能
        session-stat-max-count: # session的最大个数,默认100
        principal-session-name: # Druid获取当前的session中存储的用户信息
        principal-cookie-name:  # Druid获取当前的cookie中存储的用户信息
        profile-enable: # 打开能够监控单个url调用的sql列表
      # StatViewServlet配置,说明请参考Druid Wiki,配置_StatViewServlet配置
      # https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE
      stat-view-servlet:
        enabled: true #是否启用StatViewServlet(监控页面)默认值为false(考虑到安全问题默认并未启动,如需启用建议设置密码或白名单以保障安全)
        url-pattern: /druid/* # 配置监控后台访问路径
        # reset-enable:
        login-username: admin # 配置监控后台登录的用户名、密码
        login-password: admin
        # allow:
        # deny:
      # Spring监控配置,说明请参考Druid Github Wiki,配置_Druid和Spring关联监控配置
      # aop-patterns: # Spring监控AOP切入点,如x.y.z.service.*,配置多个英文逗号分隔

      # 配置StatFilter
      filter:
        stat:
          enabled: true
          # db-type:
          log-slow-sql: true # 开启慢 sql 记录
          slow-sql-millis: 2000 # 若执行耗时大于 2s,则视为慢 sql
      # 配置WallFilter
        wall:
          enabled: true
          # db-type:
          config:
            delete-allow: false
            drop-table-allow: false
      # 其他 Filter 配置可根据官方文档自动选择

访问监控后台
出现以下提示就表示配置成功,可以通过配置好的监控后台访问路径进行访问
image.png

使用druid加密密码

package com.leemuzi.druid;

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 DruidApplicationTests {
   

    @Test
    @SneakyThrows
    void 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);
    }

}

image.png

spring:
  datasource:
    // 省略...
    username: root
    password: I6LsOdIbnlLxBLV5Dw0+zr9OE0u/oMKh1w2i2yrPFXHMjDwp1qpXZB4up3ZvJt/QCPrHcHcIJ37hEOuEo7OadA== # 数据库密码
    druid: # Druid 连接池
      // 省略...
      connectionProperties: config.decrypt=true;config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ2rEicHO9sXBpa9Efxw74o1rJiwiODKY3znwH2K/f1yf4M9ZbyAuqMKm2DjffHa7Ol4S6ZuLtoNnzomgn/tPGcCAwEAAQ==
      // 省略...
      filter:
        config:
          enabled: true
        // 省略...
  • assword: A2qT03X7KlL4v/F2foD6kV/Ch9gpNBWOh1qoCywanjv1AsI7f9x3iAyR9NkUKeV+FMo+halCTzy5Llbk2VOrVQ==:这里的密码改为加密后的密码。
  • config.decrypt=true 表示开启密码解密功能
  • config.decrypt.key 是用于解密的密钥,即上面单元测试生成公钥。
  • 在 Druid 连接池中,如果我们的密码已经经过了加密处理,就需要在连接属性中配置解密相关的参数,以便 Druid 能够正确解密密码,然后连接到数据库。
  • filter.config.enabled: true:这里配置了 Druid 连接池的 filter,其中 config 是一个配置项,enabled: true 表示开启该配置项。这个配置项通常用于配置 Druid 连接池的一些额外功能,比如密码解密等。
目录
相关文章
|
5天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
1天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2185 11
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
1天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1238 13
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
1月前
|
运维 Cloud Native Devops
一线实战:运维人少,我们从 0 到 1 实践 DevOps 和云原生
上海经证科技有限公司为有效推进软件项目管理和开发工作,选择了阿里云云效作为 DevOps 解决方案。通过云效,实现了从 0 开始,到现在近百个微服务、数百条流水线与应用交付的全面覆盖,有效支撑了敏捷开发流程。
19265 29
|
1月前
|
人工智能 自然语言处理 搜索推荐
阿里云Elasticsearch AI搜索实践
本文介绍了阿里云 Elasticsearch 在AI 搜索方面的技术实践与探索。
18805 20
|
1月前
|
Rust Apache 对象存储
Apache Paimon V0.9最新进展
Apache Paimon V0.9 版本即将发布,此版本带来了多项新特性并解决了关键挑战。Paimon自2022年从Flink社区诞生以来迅速成长,已成为Apache顶级项目,并广泛应用于阿里集团内外的多家企业。
17509 13
Apache Paimon V0.9最新进展
|
1月前
|
存储 人工智能 前端开发
AI 网关零代码解决 AI 幻觉问题
本文主要介绍了 AI Agent 的背景,概念,探讨了 AI Agent 网关插件的使用方法,效果以及实现原理。
18695 16
|
1月前
|
人工智能 自然语言处理 搜索推荐
评测:AI客服接入钉钉与微信的对比分析
【8月更文第22天】随着人工智能技术的发展,越来越多的企业开始尝试将AI客服集成到自己的业务流程中。本文将基于《10分钟构建AI客服并应用到网站、钉钉或微信中》的解决方案,详细评测AI客服在钉钉和微信中的接入流程及实际应用效果,并结合个人体验分享一些心得。
9915 9
|
3天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
|
3天前
|
缓存 前端开发 JavaScript
终极 Nginx 配置指南(全网最详细)
本文详细介绍了Nginx配置文件`nginx.conf`的基本结构及其优化方法。首先通过删除注释简化了原始配置,使其更易理解。接着,文章将`nginx.conf`分为全局块、events块和http块三部分进行详细解析,帮助读者更好地掌握其功能与配置。此外,还介绍了如何通过简单修改实现网站上线,并提供了Nginx的优化技巧,包括解决前端History模式下的404问题、配置反向代理、开启gzip压缩、设置维护页面、在同一IP上部署多个网站以及实现动静分离等。最后,附上了Nginx的基础命令,如安装、启动、重启和关闭等操作,方便读者实践应用。
150 77
终极 Nginx 配置指南(全网最详细)