Wend看源码-Durid

项目地址

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于单片机的WIFI、语音、储存、时钟、闹钟、定位系统

所有仿真详情导航: PROTEUS专栏说明-CSDN博客 目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机,采用DS1302时钟模块,通过LCD1602显示实时时间,也可以储存时间在AT2DC02中&#xff0c…

什么是GAN?

一、基本概念 生成对抗网络(Generative Adversarial Network,GAN)是一种由两个神经网络共同组成深度学习模型:生成器(Generator)和判别器(Discriminator)。这两个网络通过对抗的方式…

RNN And CNN通识

CNN And RNN RNN And CNN通识一、卷积神经网络(Convolutional Neural Networks,CNN)1. 诞生背景2. 核心思想和原理(1)基本结构:(2)核心公式:(3)关…

【数据事务】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

南昌大学(NCU)羽毛球场地预约脚本

在冬天进行羽毛球运动是一个很好的选择,它能帮助你保持身体活力,增强心肺功能,并促进血液循环。但是室友和师弟师妹反应,学校的羽毛球场地有限,手速慢的根本预约不到场地。 中午12:00准时开放预约&#xff…

三种方式(oss、本地、minio)图片的上传下载

一、OSS 1、前期准备 1.1 注册阿里云账号,开启对象存储oss功能,创建一个bucket(百度教程多的是,跟着创建一个就行,创建时注意存储类型是标准存储,读写权限是公共读) 有的在创建桶时读写属性是…

关于Nginx前后端分离部署spring boot和vue工程以及反向代理的配置说明

最近项目中用到关于Nginx前后端分离部署spring boot和vue工程以及反向代理的配置,总结了一下说明: 1、后端是spring boot工程,端口8000,通过 jar命令启动 nohup java -jar xxx-jsonflow-biz.jar > /usr/local/nohup.out 2>…

debian 11 虚拟机环境搭建过坑记录

目录 安装过程系统配置修改 sudoers 文件网络配置换源安装桌面mount nfs 挂载安装复制功能tab 无法补全其他安装 软件配置eclipse 配置git 配置老虚拟机硬盘挂载 参考 原来去 debian 官网下载了一个最新的 debian 12,安装后出现包依赖问题,搞了半天&…

Android:生成Excel表格并保存到本地

提醒 本文实例是使用Kotlin进行开发演示的。 一、技术方案 org.apache.poi:poiorg.apache.poi:poi-ooxml 二、添加依赖 [versions]poi "5.2.3" log4j "2.24.2"[libraries]#https://mvnrepository.com/artifact/org.apache.poi/poi apache-poi { module…

RK3576技术笔记之一 RK3576单板介绍

第二篇嘛,亮亮我们做出来的板子,3576这个片子的基本功能接口单板都做了,接口数量肯定是比不上3588(PS:这个我们也在做,后续都完成后会发文章),但是比起3568来说还是升级了&#xff0…

SQL进阶技巧:如何寻找同一批用户 | 断点分组应用【最新面试题】

目录 0 问题描述 1 数据准备 2 问题分析 ​编辑 3 小结 0 问题描述 用户登录时间不超过10分钟的视为同一批用户,找出以下用户哪些属于同一批用户(SQL实现) 例如: user_name time a 2024-10-01 09:55 b 2024-10-01 09:57 c 2024-10-01…

数字图像处理(11):RGB转YUV

(1)RGB颜色空间 RGB颜色空间,是一种基于红色、绿色、蓝色三种基本颜色进行混合的颜色空间,通过这三种颜色的叠加,可以产生丰富而广泛的颜色。RGB颜色空间在计算机图像处理、显示器显示、摄影和影视制作等领域具有广泛应…

利用Ubuntu批量下载modis图像(New)

由于最近modis原来批量下载的代码不再直接给出,因此,再次梳理如何利用Ubuntu下载modis数据。 之前的下载代码为十分长,现在只给出一部分,需要自己再补充另一部分。之前的为: 感谢郭师兄的指导(https://blo…

HTTP 长连接(HTTP Persistent Connection)简介

HTTP长连接怎么看? HTTP 长连接(HTTP Persistent Connection)简介 HTTP 长连接(Persistent Connection)是 HTTP/1.1 的一个重要特性,它允许在一个 TCP 连接上发送多个 HTTP 请求和响应,而无需为…

淘宝商品详情主图SKU图价格|品牌监控|电商API接口

淘宝/天猫获得淘宝商品详情 API 返回值说明 item_get-获得淘宝商品详情 taobao.item_get 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中&a…

单片机学习笔记 17. 串口通信-发送汉字

更多单片机学习笔记:单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…

五层网络协议(封装和分用)

目录 七层网络协议五层网络协议封装1.应用层2.传输层3.网络层4.数据链路层5.物理层 分用1. 物理层2.数据链路层3.网络层 IP 协议4.传输层 UDP 协议5.应用层 七层网络协议 网络通信过程中,需要涉及到的细节,其实是非常非常多的,如果要有一个协…

阿里云人工智能平台(PAI)免费使用教程

文章目录 注册新建实例交互式建模(DSW)注册 注册阿里云账号进行支付宝验证 新建实例 选择资源信息和环境信息,填写实例名称 资源类型需要选择公共资源,才能使用资源包进行抵扣。目前每月送250计算时。1 * NVIDIA A10 8 vCPU 30 GiB 1 * 24 GiB1 * NVIDIA V100 8 vCPU 32 Gi…

【实战】Oracle基础之控制文件内容的5种查询方法

关于Jady: ★工作经验:近20年IT技术服务经验,熟悉业务又深耕技术,为业务加持左能进行IT技术规划,右能处理综合性故障与疑难杂症; ★成长历程:网络运维、主机/存储运维、程序/数据库开发、大数…

蓝桥杯第 23 场 小白入门赛

一、前言 好久没打蓝桥杯官网上的比赛了,回来感受一下,这难度区分度还是挺大的 二、题目总览 三、具体题目 3.1 1. 三体时间【算法赛】 思路 额...签到题 我的代码 // Problem: 1. 三体时间【算法赛】 // Contest: Lanqiao - 第 23 场 小白入门赛 …