当前位置: 首页> 游戏> 单机 > 制作表白网站教程_163企业邮箱登陆_免费二级域名查询网站_什么是论坛推广

制作表白网站教程_163企业邮箱登陆_免费二级域名查询网站_什么是论坛推广

时间:2025/7/11 18:28:14来源:https://blog.csdn.net/weixin_41645817/article/details/144114574 浏览次数:0次
制作表白网站教程_163企业邮箱登陆_免费二级域名查询网站_什么是论坛推广

项目地址

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

关键字:制作表白网站教程_163企业邮箱登陆_免费二级域名查询网站_什么是论坛推广

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: