所属文章:池化技术(一)Druid是如何管理数据库连接的?

本篇为「工具人」文章,建议直接用「ctrl+f」进行查找属性、方法、类名,快速了解其含义和所属类。

主要流程里主要涉及到的类名称、类属性、类方法如下图(淡黄色表示属性,淡蓝色表示方法):

类图

DruidAbstractDataSource抽象类

这个类是druid连接池基础类,定义了一些连接池该有的基本属性,以及生成驱动连接对象的方法。

属性表:

username 用户名
password 密码
jdbcUrl 驱动连接
driverClass 驱动class,可以不用配置
initialSize 初始化连接池(主流程2)时需要预先生成的连接对象个数
maxActive 池内最大连接数,也就是说生成连接的线程在当前池内连接数超过这个指标后就不再工作了,参考主流程3
minIdle 池内最小闲置连接数,参考流程4.1
maxWait 在业务线程拿不到可用连接而发生排队时,等待获取到可用连接对象的最大等待时间,参考主流程1流程1.2
notFullTimeoutRetryCount 获取不到连接时,会尝试重试,这里表示最大重试次数,参考主流程1
testOnBorrow 在取出链接时,是否进行连接可用性测试,默认不开启,参考主流程1
testOnReturn 在回收连接时,是否进行连接可用性测试,默认不开启,参考主流程5
testWhileIdle 在闲置时间超出指定时间(timeBetweenEvictionRunsMillis)后进行连接可用性测试
timeBetweenEvictionRunsMillis 默认60s,一个连接闲置时间超出该值,且设置了testWhileIdle为true时,进行连接可用性测试
inited 是否已被初始化过,参考主流程2
filters(集合) 触发责任链执行时需要执行的所有filter
maxWaitThreadCount 默认不开启(-1),表示取不到连接发生等待时阻塞的最大业务线程数,参考流程1.2
removeAbandoned 是否主动回收一些被拿出去使用长久没有归还的连接,默认不开启,参考流程4.2
removeAbandonedTimeoutMillis 表示在removeAbandoned开启的情况下,触发主动归还的时间间隔。
dbType 标记该连接池对象是属于什么数据库类型(根据驱动协议头推算出来)
validConnectionChecker druid有多个验证长连接可用性的checker对象,该属性最终会根据数据库类型适配合适的checker对象,参考流程1.3里的init-checker
lock 控制连接池线程安全的全局重入锁(参考全部流程里出现的lock)
notEmpty 由lock创建的Condition,用于连接不够用时阻塞业务线程,同时唤起主流程3的守护线程追加连接,解释参考主流程2特别说明②
empty 由lock创建的Condition,用于连接足够时(不发生线程等待),阻塞主流程3的守护线程,解释参考主流程2特别说明②
activeConnectionLock 活动连接重入锁,被借出去的连接称为active连接,这类连接在removeAbandoned开启时会被保存进下面的activeConnections里,利用该锁完成对其操作的安全性,参考主流程1流程4.2
activeConnections(k-v) 解释参考上面的描述,参考主流程1流程4.2

表1-1

方法表:

testConnectionInternal 测试连接可用性的基本方法,参考流程1.3
createPhysicalConnection 新增真正的数据库物理连接,参考流程2.1

表1-2

DruidDataSource类

这个类也是druid连接池基础类,扩展了一些其父类的功能,几乎所有的有关连接池管理的操作都在此类完成。

属性表:

connectCount 一共成功从该池获取了多少次连接(只要获取成功一次,就累加一次)
recycleCount 一共成功归还了多少次连接到该池(成功归还一次,累加一次)
removeAbandonedCount 在removeAbandoned开启的情况下,被检查后强制归还的连接数
connections(数组) 最终池子里没有被使用的闲置连接存放的地方,类型是DruidConnectionHolder
poolingCount pollingCount就是指上面connections的真实数量
activeCount 当前处于借出状态的连接数(也即是被拿出去使用的连接数),poolingCount+activeCount就是当前该池子里一共有多少个连接,不能超过maxActive,参考主流程3
discardCount 被丢弃的连接数,触发丢弃的地方有很多,比如流程1.4、流程4.1
evictConnections(数组) 参考流程4.1
keepAliveConnections(数组) 参考流程4.1
createConnectionThread(线程) 生产连接的守护线程,参考主流程3
destroyConnectionThread(线程) 抛弃连接的守护线程,参考主流程4
logStatsThread(线程) 打印连接池各项监控指标日志的守护线程,参考主流程2,默认关闭
initedLatch(CountDownLatch) 倒计数器,用来保证createConnectionThread和destroyConnectionThread两个守护线程全部开启成功。
enable 连接池对象是否可用,在连接池整体close后,该值为false,表示已关闭的连接池不可用。
keepAlive 参考流程4.1
loadSpifilterSkip 是否启用通过SPI机制加载责任链上的filter,默认开启

表2-1

方法表:

init 初始化整个连接池,参考主流程2
initFromSPIServiceLoader 通过SPI机制加载责任链中的filters
initValidConnectionChecker 初始化(适配)检测器,参考流程1.3中的init-checker
createAndLogThread 启动上面表2-1里的logStatsThread线程
createAndStartCreatorThread 启动上面表2-1里的createConnectionThread线程
createAndStartDestroyThread 启动上面表2-1里的destroyConnectionThread线程
getConnection 获取连接方法,参考主流程1
getConnectionDirect 获取连接方法(通过getConnection触发),参考主流程1
pollLast 真正从池子里获取连接对象的方法(通过getConnectionDirect触发),参考流程1.2
putLast 真正归还连接进池子的方法(通过recycle触发),参考主流程5
put 新增连接对象放进池子里的方法,通过主流程3触发
close 连接池关闭,不再提供服务,迅速干掉所有连接进入贤者模式。
recycle 连接回收方法,通过下面DruidPooledConnection类的close方法触发,参考主流程5
shrink 连接池瘦身,参考主流程4、流程4.1
removeAbandoned 回收长期未回收的连接,默认关闭不检查,通过表1-1里的removeAbandoned属性控制
emptySignal 触发表1-1里的empty执行signal,用于唤起主流程3新增连接

表2-2

DruidConnectionHolder类

最终存放进池子里的基本类型,该类持有驱动产生的真实Connection对象,同时提供一些连接池需要的标记性的属性。

属性表:

dataSource(DruidDataSource) 本身包含一个持有自己实例的连接池对象
conn(Connection) 真实的驱动连接对象
lastActiveTimeMillis 上次活动时间,该值在归还连接时会被刷新一次,参考主流程5,除此之外在一句sql执行结束后,这个值也会被刷新
defaultReadOnly 是否默认为只读模式,默认不是
defaultAutoCommit 是否默认开启AutoCommit,默认开启
discard 当前连接是否已被抛弃

表3-1

方法表:

reset 在连接对象被归还时,由于使用时可能被业务代码人为的改动一些属性(比如autoCommit等)需要把一些属性重新置为默认值,就需要该方法

表3-2

DruidPooledConnection类

对外暴露给业务方的连接对象包装类,实际上其内部是包了一层上面的holder对象。

属性表:

conn(Connection) 实际的驱动连接对象,通过下面持有的holder对象获得并赋值
holder(DruidConnectionHolder) 持有的holder对象
disable 标记是否可用
ownerThread 标记最初获取到自己的那个线程(用于决定在close时走下方的close还是syncClose,参考主流程5
closed 标记是否已被关闭
running 标记是否正在运行中,running被置为true的地方,就是执行excute方法时。
abandoned 标记是否已被检查并丢弃,参考流程4.2

表4-1

方法表:

close 关闭该连接,将实际连接归还至连接池,参考主流程5
syncClose 如果是别的线程执行close方法,就得启用该方法去做,该方法与上面close的区别就是加了锁控制,参考流程5
recycle 实际触发datasource.recycle方法的方法,参考流程5
常规操作 有createStatement、commit、rollback等等常规操作,本篇文章不涉及到,仅做连接池的说明,暂时忽略。

表4-2

Druid-类图-属性表的更多相关文章

  1. MFC中属性表单和向导对话框的使用

    每次在使用MFC创建一个框架时,需要一步步选择自己的程序的外观,基本功能等选项,最后MFC会生成一个基本的程序框架,这个就是向导对话框:而属性表单则是另外一种对话框,表单上有多个属性页,每点击某一页, ...

  2. 【软件设计】UML类图怎么看

    前言 无论使用哪种语言,都离不开面向过程与面向对象两个流派,而类图是面向对象程序设计中至关重要的一种软件表达形式,如何看懂类图,并设计好的软件架构,是我们作为软件工程师必不可少的技能之一. 今天小黑把 ...

  3. 如何将Excel表批量赋值到ArcGIS属性表

    情景再现 现需要将Excel表信息批量赋值(不是挂接)到Shp文件的属性表,两张表的字段.记录数一模一样,至于为什么会出现这样的问题,咱也不敢问,只有想个法子把它搞定! 原始的Excel信息表共57列 ...

  4. UML 用例图、顺序图、状态图、类图、包图、协作图、流程图

    ​用例图.顺序图.状态图.类图.包图.协作图 面向对象的问题的处理的关键是建模问题.建模可以把在复杂世界的许多重要的细节给抽象出.许多建模工具封装了UML(也就是Unified Modeling La ...

  5. 我对uml类图关系的理解

    uml类图的关系: 泛化关系也就是继承. 实现关系就是一个类实现另外一个接口. 依赖关系就是一个类使用了另外一个类,是一种使用关系,在这个类的某个服务中需要另外一个类来协助. 关联关系就是一类拥有另外 ...

  6. [转]看懂UML类图

    这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之间的线条.箭头代表什么意思后,也就足够应对 日常的工作和交流: 同时,我们应该能将类图所表达的含义和最终的代码 ...

  7. 转:深入浅出UML类图(具体到代码层次)

    深入浅出UML类图 作者:刘伟 ,发布于:2012-11-23,来源:CSDN   在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin Fowler在其著作<UML ...

  8. UML类图画法及其之间的几种关系(转)

    UML类图画法及其之间的几种关系 最近做重构项目,需要画一下类图,发现类图的画法及其之间的几种关系已经淡忘了很多,所以整理总结一下,有问题的地方大家可以一起讨论下. 文章目录如下: 类图画法 类之间的 ...

  9. 深入浅出UML类图(一)

    在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin Fowler在其著作<UML Distilled: A Brief Guide to the Standard O ...

随机推荐

  1. 理解ConcurrentHashMap1.8源码

    ConcurrentHashMap源码分析 其实ConcurrentHashMap我自己已经看过很多遍了,但是今天在面试阿里的时候自己在描述ConcurrentHashMap发现自己根本讲不清楚什么是 ...

  2. ruby中的数组相关方法介绍

    l = ["a","b","c","d","e","f",'g'] puts l ...

  3. 一泡尿的时间,快速读懂QUIC协议

    1.TCP协议到底怎么了? 现时的互联网应用中,Web平台(准确地说是基于HTTP及其延伸协议的客户端/服务器应用)的数据传输都基于 TCP 协议. 但TCP 协议在创建连接之前需要进行三次握手(如下 ...

  4. 记录开发基于百度地图API实现在地图上绘制轨迹并拾取轨迹对应经纬度的工具说明

    前言: 最近一直在做数据可视化方面的工作,其中平面可视化没什么难度,毕竟已经有很多成熟的可供使用的框架,比如百度的echart.js,highcharts.js等.还有就是3D可视化了,整体来说难度也 ...

  5. .NET开源类库Nini手册(INI、XML、注册表的配置应用)-中文翻译

    目录 1.简介 1.1什么是应用程序配置数据? 1.2问题 1.3介绍Nini 2.入门 2.1一个简单的例子 2.2默认值 2.3设置.保存和删除键 2.4添加和删除配置 2.5键值扩展 3.高级主 ...

  6. 《C#并发编程经典实例》学习笔记—2.9 处理 async void 方法的异常

    问题 需要处理从 async void 方法传递出来的异常. 解决方案 书中建议尽量不写 async void 这样的方法,如果非写不可,建议在方法内部 try catch 所有的代码,即在方法内部处 ...

  7. JavaScript设计模式基础(一)

    模式的起源 模式 起源于建筑学.20世纪70年代,哈佛大学建筑学博士Christopher Alexander和他的团队花大约20年,来研究为解决同一个问题而设计出的不同建筑结构,从中发现那些高质量设 ...

  8. Abusing SUDO Advance for Linux Privilege Escalation

    Index What is SUDO? Scenario. Sudoer FIle Syntax. Exploiting SUDO zip tar strace tcpdump nmap scp ex ...

  9. Android View的background和padding

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/181 最近在做一个需求,是对im聊天消息设置气泡背景,之前 ...

  10. 六、接上一个博客-ITK例子运行结果

    一.程序介绍 该程序的主要思路如下: 二.程序参数 1-程序自己创建三维图像的时候 我自己计算得到的参数如下: 三维图像参数:  旋转参数: 光线投射法参数: 当我们输入参数:  -v 得到程序的输出 ...