美文网首页
Druid连接池源码解析(7)ExceptionSorter&V

Druid连接池源码解析(7)ExceptionSorter&V

作者: 错乱的三元运算 | 来源:发表于2022-05-18 15:56 被阅读0次

    1 ExceptionSorter&ValidConnectionChecker

    ExceptionSorter&ValidConnectionChecker 都是com.alibaba.druid.pool.vendor包下面的组件,
    这篇应该是pool包的最后一篇了,看一下mysql下典型实现的类图:


    ExceptionSorter.png
    ValidConnectionChecker.png

    关系都比较简单,都是对应各种不通数据库的实现。

    2 ValidConnectionChecker

    ValidConnectionChecker是在dataSource中的init()->initValidConnectionChecker()方法中初始化,根据DriverClass生成相应数据库的checker,调用的话在validateConnection和testConnectionInternal两个方法中

    • validateConnection 在createPhysicalConnection和shrink中调用(shrink是缩小连接池时,发现连接不可用直接废弃)
    • testConnectionInternal在遇到testWhileIdle,testOnBorrow,testOnReturn时会调用,验证连接的有效性;
      如果有相关数据库的ValidConnectionChecker,则使用ValidConnectionChecker验证
      如果没有ValidConnectionChecker,则直接使用validationQuery验证;MySqlValidConnectionChecker会使用Mysql独有的ping方式进行验证,其他数据库其实也都是使用validationQuery进行验证

    3 ExceptionSorter

    官方对于这些ExceptionSorter的作用是这么定义的:

    当网络断开或者数据库服务器Crash时,连接池里面会存在“不可用连接”,连接池需要一种机制剔除这些“不可用连接”。在Druid和JBoss连接池中,剔除“不可用连接”的机制称为ExceptionSorter,实现的原理是根据异常类型/Code/Reason/Message来识别“不可用连接”。没有类似ExceptionSorter的连接池,在数据库重启或者网络中断之后,不能恢复工作,所以ExceptionSorter是连接池是否稳定的重要标志。

    具体调用是在Connection异常发生时,最后都会落到DruidDataSource的handleConnectionException方法,主要就是判断是否Fatal error,不是就继续往外抛异常,是的话,就调用handleFatalError,最终把连接物理关闭

    4 总结

    本篇主要是driud对于异常的判断和处理的流程总结,是init()中的一些细节的补充;
    由于远程IO连接的特性,不能在连接一有异常的时候,系统就能感知到,所以用了上述方式去处理,在业务中也是值得借鉴的,即:

    • 对于异常的诊断与处理解耦
    • 异常的处理可以按异常等级的划分,同过异常传递机制,分别处理

    相关文章

      网友评论

          本文标题:Druid连接池源码解析(7)ExceptionSorter&V

          本文链接:https://www.haomeiwen.com/subject/rmraurtx.html