Wend看源码-Durid

news2025/1/6 20:16:50

项目地址

GitHub - alibaba/druid: 阿里云计算平台DataWorks(https://help.aliyun.com/document_detail/137663.html) 团队出品,为监控而生的数据库连接池

简介

        Druid连接池是阿里巴巴开源的数据库连接池项目,自2011年开源以来,它因其卓越的性能和丰富的功能在国内外开发者中获得了广泛的应用和好评。

  • 以下是Druid 的一些核心特点和优势:
    • 强大的监控功能:Druid提供了全面的监控功能,官网的定义为为监控而生的数据库连接池。其监控内容包括SQL执行时间、执行次数、慢SQL记录等,帮助开发者及时发现和解决问题。
    • 防SQL注入:Druid基于SQL Parser内置了WallFilter(防火墙过滤器),可以有效防止SQL注入攻击,增强系统安全性。
    • 支持集群和分布式:Druid支持集群配置,并支持在分布式系统中使用,能够处理分布式事务,适应现代分布式架构的需求。
    • ExceptionSorter机制:根据不同数据库的特性,Druid能够智能地处理数据库异常。
    • Mbean:通过JMX技术,Druid可以方便地管理和监控连接池的状态。
    • FilterChan责任链模式:Druid的过滤器链采用了责任链模式,使得扩展和定制变得非常灵活。
    • SPI机制:Druid 的过滤器,WallFilter等支持通过SPI 机制进行拓展
    • 良好的兼容性:Druid兼容各种主流数据库,如MySQL、Oracle、SQL Server等,并且对于Oracle 和 Mysql 这种主流数据库有特殊的特性支持,可以提高连接池效率。

    • 社区活跃:Druid拥有一个活跃的社区,不断有新的功能和优化被加入到项目中,保证了项目的持续发展。

        接下来我们关注一下Druid 的代码体量,从统计上看,截至2024-11-28日,Druid 的Java 总文件数达到了 5097个,代码行405448行,已经是一个大型项目了。需要提及的一点是Druid 源码的注释非常少,可以说基本上没有注释。不知是有意为之,还是温少大神的编码风格就是这样。。。

核心流程

图 1 Druid 连接池核心流程时序图

DuridDataSource

        用户使用Durid连接池获取数据库连接的入口,主要包括以下方法:

  • init :初始化连接池。
    • initFromSPIServiceLoader: 通过SPI机制加载责任链中的filters
    • initExceptionSorter:初始化异常处理机制
    • initValidConnectionChecker:根据配置参数和数据库驱动初始化指定数据库类型的(适配)检测器
    • createAndLogThread:创建一个日志记录的守护进程
    • createAndStartCreatorThread:创建一个用于增加链接的守护进程
    • createAndStartDestroyThread:创建一个丢弃连接的守护进程
  • getConnection:获取连接方法,一种是走Filter责任链获取连接,一种是直接获取连接
    • pollLast/takeLast:真正从池子里获取连接对象的方法
  • cloneDruidDataSource:克隆一个连接池对象
  • recycle:回收连接池的连接,通过DruidPooledConnection类的close方法触发
    • putLast:归还连接进池子的方法
    • discardConnection:从连接池丢弃连接
  • createSchedulerFutures:主动新增连接的定时任务
    • clearCreateTask:清理新增定时任务
    • submitCreateTask:提交新增任务
    • emptySignal:用于唤起新增连接流程
    • put:新增连接对象放进池子里的方法
  • close:连接池关闭,不再提供服务,迅速干掉所有连接进入贤者模式
  • removeAbandoned:回收长期未回收的连接,默认关闭不检查
  • shrink:连接池瘦身

DruidAbstractDataSource

        DruidAbstractDataSource 是DruidDataSource 的父类,为DruidDataSource提供基础支持。DruidAbstractDataSource主要处理配置参数的加载、Filter责任链的操作以及封装了具体的获取物理连接的操作方法。

责任链相关

  • createChain:创建Filter责任链
  • recycleFilterChain:重置Filter责任链
  • setFilters/addFilters:添加Filter 责任链
  • clearFilters:清除全部的Filter

获取连接相关

  • createPhysicalConnection:创建一个物理连接
  • initPhysicalConnection:根据配置参数初始化物理连接
  • getConnectionInternal:从池子里获取真正的连接对象
  • testConnectionInternal:根据参数配置测试这个连接的有效性
  • setConnectionProperties:将参数配置加载到数据库参数对象中
  • initSqls:加载初始化SQL  

ConnectionProxyImpl

        ConnectionProxyImpl 是Durid对于数据库连接的代理对象。它其中包含Connection,真实的连接对象,Properties 参数配置对象,DataSourceProxy 数据库资源代理对象,filterChan 责任链对象。   ConnectionProxyImpl 的主要操作是通过资源找到FilterChan,然后通过FilterChan进行提交,关闭等操作。

DruidConnectionHolder

        DruidConnectionHolder 是Durid的连接池操作对象。负责持有从物理数据库连接池中获取的数据库连接。当应用程序需要访问数据库时,Druid会从连接池中提供一个DruidConnectionHolder实例,该实例封装了实际的数据库连接。

Druid 的详细流程讲解请参考以下文章:

数据库连接池剖析3-3(Druid原理分析)_durid-CSDN博客

FilterChain 责任链模式处理功能拓展

         FilterChain是Dubbo 对于连接池功能拓展的入口,它使用了责任链模式,在连接池初始化的时候会加载过滤器。而后请求会依次通过这些过滤器,每个过滤器都可以对请求进行处理,并将处理后的请求传递到下一个过滤器。开发者也可以通过实现 com.alibaba.dubbo.rpc.Filter 接口来自定义过滤器,并在Dubbo的配置文件中(如 dubbo.xml 或 dubbo.properties)指定这些过滤器,从而构建出符合特定需求的 FilterChain

图2 Dubbo 连接池的Filter相关类图

        FilterChain 是Dubbo Filter 的责任链封装。Dubbo 的Filter 主要分为六类实现,分别是:

  • FilterAdapter:提供JdbcFilter的基本实现,使得实现一个JdbcFilter更容易,用户也可以继承FilterAdapter 类,并通过SPI 机制加载自己的Filter。
  • FilterEventAdapter:带Filter 执行前后事件的实现类,用户可以继承FilterEventAdapter实现自己的Filter。
  • ConfigFilter :初始化Filter 时加载,这个类主要是负责两个事情:解密和下载远程的配置文件。Dubbo 的配置加密和远程配置文件功能都是基于ConfigFilter 实现的。
  • LogFilter:处理关于展示日志的内容,如connectionLong,statementLog,resultSetLog等。
  • StatFilter:Dubbo 的监控功能都是基于StatFilter 实现的。以及包括满sql 查询,和sql 合并等功能的实现
  • WallFilter:Dubbo 的防火墙,包含防SQL 注入,以及包含参数校验等功能。用户也可通过spi机制,定义自己的WallFilter 。

使用ExceptionSorter机制提高连接池稳定性

        ExceptionSorter机制是Durid 参考Jobb 实现的自动化处理异常的机制。使用ExceptionSorter 可以大大提高Druid 数据库连接池的稳定性。在Druid中,会根据连接池连接数据库的类型自动匹配不同类型的ExceptionSorter,不需要额外配置。

        Durid 的ExceptionSorter 实现是基于不同的数据库,以及如NullException 这种常见的异常进行的实现,它是完全拿来即用的代码。后续我们在编写项目的时候,也可以采用ExcepitonSorter机制对不同类型的异常进行自动的处理判断逻辑,以提高整个系统的稳定性。

Durid 手写高性能SQLParser

        Durid 的手写SQLParser 是Durid 的亮点之一,性能非常好,目标就是在生产环境运行时使用的SQL Parser,性能比antlr、javacc之类工具生成的Parser快10倍甚至100倍以上。Druid SQL Parser分三个模块Parser,AST,Visitor。

parser

  • parser是将输入文本转换为ast(抽象语法树)

  • parser有包括两个部分,

    • Parser,Parser实现语法分析。
    • Lexer,其中Lexer实现词法分析。

AST

  • AST是abstract syntax tree的缩写,也就是抽象语法树。和所有的Parser一样,Druid Parser会生成一个抽象语法树。Durid 的AST主要包括的种抽象类型有:

    • SQLObject:SQLObject 是 AST 中的基本抽象类型,它是所有 SQL 构造块的基类。它代表 SQL 语句中的任何元素,包括语句本身、表达式、表源等。SQLObject 提供了一个通用的接口,用于访问和操作 SQL 语句的各个部分。它通常包含用于遍历和修改 AST 的方法。

    • SQLStatement:SQLStatementSQLObject 的一个子类,它代表一个完整的 SQL 语句,如 SELECTINSERTUPDATEDELETE 等。SQLStatement 用于表示整个 SQL 操作,它包含了执行特定数据库操作所需的所有信息。

    • SQLExpr:SQLExprSQLObject 的另一个子类,它代表 SQL 语句中的表达式。表达式可以是字面量、列引用、函数调用、运算符表达式等。SQLExpr 用于表示 SQL 语句中的计算部分,它可以出现在 SELECT 列表、WHERE 子句、ORDER BY 子句等地方。

    • SQLTableSource:SQLTableSourceSQLObject 的一个子类,它代表 SQL 语句中的数据源,即表或视图。SQLTableSource 用于指定 SQL 查询中数据的来源,它可以是基表、视图、子查询或者表别名。

Visitor

  • Visitor是遍历AST的手段,是处理AST最方便的模式,Visitor是一个接口,我们可以实现不同的Visitor来满足不同的需求,Druid内置提供了如下Visitor:

    • VisitorAdapter:提供了实现VIsitor的默认方法,允许开发者在不实现所有方法的情况下扩展或修改某些行为
    • OutputVisitor:用来把AST输出为字符串
    • WallVisitor:来分析SQL语意来防御SQL注入攻击
    • ParameterizedOutputVisitor:用来合并未参数化的SQL进行统计
    • EvalVisitor:用来对SQL表达式求值
    • ExportParameterVisitor:用来提取SQL中的变量参数
    • SchemaStatVisitor:用来统计SQL中使用的表、字段、过滤条件、排序表达式、分组表达式
    • SQL格式化: Druid内置了基于语义的SQL格式化功能
  • 自定义 Vistitor,每种方言的 Visitor 都有一个缺省的 VisitorAdapter,使得编写自定义的 Visitor 更方便。

集群和分布式事务支持

集群

        Druid 依赖于 ZooKeeper 来实现集群管理和服务协调。ZooKeeper 是一个开源的分布式协调服务,它为分布式应用提供一致性服务。Durid 的集群处理逻辑在com.alibaba.druid.pool.ha.node包中。

        关于Druid 的集群搭建请参考以下文章

https://zhuanlan.zhihu.com/p/555432134

分布式事务

        Durid使用了XA来实现分布式事务。X/Open的XA规范定义了分布式事务的标准,支持多个资源管理器(如数据库、消息队列等)之间的事务协调。虽然Druid本身不支持XA事务,但可以通过配置支持XA事务的数据库驱动来实现。
        在使用XA事务时,需要一个事务管理器(如JTA - Java Transaction API)来协调事务。Druid连接池可以配置为使用支持XA事务的DataSource,这样事务管理器就可以通过Druid连接池来管理分布式事务。        

参考文献

ExceptionSorter_cn · alibaba/druid Wiki · GitHub

数据库连接池剖析3-3(Druid原理分析)_durid-CSDN博客

https://zhuanlan.zhihu.com/p/555432134

Druid连接池介绍 · alibaba/druid Wiki · GitHub

https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98

https://juejin.cn/post/7329767824200450086

附录

Durid 配置属性表

DruidDataSource配置属性列表 · alibaba/druid Wiki · GitHub

Durid 推荐配置

DruidDataSource配置 · alibaba/druid Wiki · GitHub

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

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

相关文章

GY302光照传感器模块详解

目录 一、引言 二、功能特点 三、工作原理 四、引脚功能 五、应用场景 六、使用方法 七、总结 一、引言 在当今科技飞速发展的时代,传感器技术在各个领域都发挥着至关重要的作用。光照传感器作为一种能够感知环境光照强度的设备,广泛应用于农业、…

分布式事务调研

目录 需求背景: 本地事务 分布式基本理论 1、CAP 定理 2、BASE理论 分布式事务方案 #2PC #1. 运行过程 #1.1 准备阶段 #1.2 提交阶段 #2. 存在的问题 #2.1 同步阻塞 #2.2 单点问题 #2.3 数据不一致 #2.4 太过保守 3PC #本地消息表 TCC TCC原理 …

win10系统部署RAGFLOW+Ollama教程

本篇主要基于linux服务器部署ragflowollama,其他操作系统稍有差异但是大体一样。 一、先决条件 CPU ≥ 4核; RAM ≥ 16 GB; 磁盘 ≥ 50 GB; Docker ≥ 24.0.0 & Docker Compose ≥ v2.26.1。 如果尚未在本地计算机&#xff…

自然语言处理期末试题汇总

建议自己做,写完再来对答案。答案可能存在极小部分错误,不保证一定正确。 一、选择题 1-10、C A D B D B C D A A 11-20、A A A C A B D B B A 21-30、B C C D D A C A C B 31-40、B B B C D A B B A A 41-50、B D B C A B B B B C 51-60、A D D …

Android Studio的AI工具插件使用介绍

Android Studio的AI工具插件使用介绍 一、前言 Android Studio 的 AI 工具插件具有诸多重要作用,以下是一些常见的方面: 代码生成与自动补全 代码优化与重构 代码解读 学习与知识获取 智能搜索与资源推荐实际使用中可以添加注释,解读某段代…

iQOO Neo10系列携三大蓝科技亮相,性能与续航全面升级

11月29日,iQOO Neo10系列正式登场。作为iQOO Neo系列的最新力作,Neo10系列不仅延续了该系列一贯的“双芯”特色,更在性能、续航、屏幕、影像等多个方面实现了全面升级,为用户带来前所未有的使用体验。此次发布的Neo10系列共有两款…

172页PPT集团数字化转型采购供应链及财务管控业务流程指南

一、供应商管理与数字化转型 1.1供应商管理数字化的重要性与挑战 重要性: 效率提升: 数字化可以提高供应商管理的效率,通过自动化流程减少手动操作,加快决策速度。透明度增强: 数字化工具可以提供实时数据&#xff…

springboot338it职业生涯规划系统--论文pf(论文+源码)_kaic

毕 业 设 计(论 文) 题目:it职业生涯规划系统的设计与实现 摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以…

【深度学习基础】一篇入门模型评估指标(分类篇)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀深度学习_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. 模…

【STM32学习】TB6612FNG驱动芯片的学习,驱动电路的学习

目录 1、TB6612电机驱动芯片 1.1如下是芯片的引脚图: 1.2如下图是电机的控制逻辑: 1.3MOS管运转逻辑 1.3典型应用电路 2、H桥驱动电路 2.1、单极模式 2.2、双极模式 2.3、高低端MOS管导通条件 2.4、H桥电路设计 2.5、自举电路 3、电气特性 3…

STM32 HAL库开发学习3.STM32启动浅析

STM32 HAL库开发学习3.STM32启动浅析 一、STM32启动模式(也称自举模式)1. MSP与PC指针赋值2. F1系列的启动模式:3. F4系列启动模式4. F7系列启动模式5. H7系列启动模式 二、STM32启动过程1. MSP 栈顶地址2. PC值3. Reset_Handler4. 启动文件内…

FCBP 认证考试要点摘要

理论知识 数据处理与分析:包括数据的收集、清洗、转换、存储等基础操作,以及数据分析方法,如描述性统计分析、相关性分析、数据挖掘算法等的理解和应用 。数据可视化:涉及图表类型的选择与应用,如柱状图、折线图、饼图…

xv6前置知识

fork函数 一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程分…

ECharts柱状图-极坐标系下的堆叠柱状图,附视频讲解与代码下载

引言: 在数据可视化的世界里,ECharts凭借其丰富的图表类型和强大的配置能力,成为了众多开发者的首选。今天,我将带大家一起实现一个柱状图图表,通过该图表我们可以直观地展示和分析数据。此外,我还将提供…

监控视频汇聚平台:Liveweb视频监控管理平台方案详细介绍

Liveweb国标视频综合管理平台是一款以视频为核心的智慧物联应用平台。它基于分布式、负载均衡等流媒体技术进行开发,提供广泛兼容、安全可靠、开放共享的视频综合服务。该平台具备多种功能,包括视频直播、录像、回放、检索、云存储、告警上报、语音对讲、…

MySQL源码编译

华子目录 下载源码包上传并解压安装cmake环境检测make编译make install安装 部署复制编译文件到别的主机上 下载源码包 下载相应源码包mysql5.7编译安装需要boost库,这里官网下载含boost的源码包https://downloads.mysql.com/archives/community/ 上传并解压 [roo…

请求(request)

目录 前言 request概述 request的使用 获取前端传递的数据 实例 请求转发 特点 语法 实例 实例1 实例2 【关联实例1】 域对象 组成 作用范围: 生命周期: 使用场景: 使用步骤 存储数据对象 获得数据对象 移除域中的键值…

推荐学习笔记:矩阵补充和矩阵分解

参考: 召回 fun-rec/docs/ch02/ch2.1/ch2.1.1/mf.md at master datawhalechina/fun-rec GitHub 业务 隐语义模型与矩阵分解 协同过滤算法的特点: 协同过滤算法的特点就是完全没有利用到物品本身或者是用户自身的属性, 仅仅利用了用户与…

构造函数与析构函数错题汇总

构造函数不能定义返回类型,也没有返回类型。 堆、栈、静态存储区。栈上的对象main函数结束就释放,堆上的需要手动释放,静态存储区的在所在作用域的程序结束时释放。这里static在main函数内,是局部变量,所以作用域为…

[免费]SpringBoot+Vue景区订票(购票)系统【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue大景区订票(购票)系统,分享下哈。 项目视频演示 【免费】SpringBootVue景区订票(购票)系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 现代经济快节奏发展以及不断完善升级的信息…