前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Druid源码阅读10-DruidDataSource中的一些计数器

Druid源码阅读10-DruidDataSource中的一些计数器

作者头像
冬天里的懒猫
发布2021-11-24 15:05:44
1.1K0
发布2021-11-24 15:05:44
举报

在Druid连接池的工作过程中,会用到一些计数器对Druid的情况进行判断。然后根据计数器的数据采取一系列操作,整理如下:

1.统计类的计数器

变量名

类型

说明

connectCount

long

getConnectionInternal被调用之后就会增加,意味着连接被get的次数。

closeCount

long

连接调用recycle中,包括回收、关闭等情况,成功之后会增加,标识连接关闭的次数。

recycleCount

long

连接调用recycle成功之后才会增加,不包括在回收过程中关闭的情况。标识连接真正回收的次数。

removeAbandonedCount

long

连接调用removeAbandoned成功之后才会增加,标识连接跟踪泄露机制的执行次数。

notEmptyWaitCount

long

连接调用pollLast或者tackLast之后就会增加,实际上是触发notEmpty.await的的次数.

notEmptySignalCount

long

连接触发notEmpty的signal的次数。

discardCount

volatile long

调用discard成功之后的次数。

上述long类型的计数器,全部只会增加,不会减少,在Druid工作的过程中进行统计和监控作用。

2.状态相关的计数器

变量名

类型

说明

poolingCount

int

DruidConnectionHolder[] connections数组中连接的数量。

activeCount

int

Map<DruidPooledConnection, Object> activeConnections 中的连接数量。

notEmptyWaitThreadCount

int

连接被取出之后,触发notEmpty进行wait线程的数量。

activePeak

int

activeCount出现的峰值。

poolingPeak

int

poolingCount出现的峰值。

createTaskCount

int

创建连接线程数的计数器。

3.相关的判断逻辑:

poolingCount < initialSize 时,创建连接以达到初始化连接数。 poolingCount >= maxActive 时,回收的连接会被拒绝放入connections中。

activeCount + poolingCount >= maxActive时, empty.await(),创建连接的线程会被取消。 activeCount + poolingCount <= minIdle 时,通知emptySignal(),通知继续创建连接。 keepAlive && poolingCount + activeCount < minIdle 时,再shrink方法中needFill为true,会触发通知emptySignal(),继续创建连接。 activeCount + poolingCount + createTaskCount >= maxActive 时,开启了createScheduler,则会取消createScheduler的创建任务。 activeCount <= minIdle 时,触发emptySignal(),创建连接。

4.存储Connection的容器

变量名

类型

说明

connections

DruidConnectionHolder[]

连接存放的数组。

keepAliveConnections

DruidConnectionHolder[]

keepAlive连接存放的数组。只会在shrink中开启了keepalive才会使用。

evictConnections

DruidConnectionHolder[]

需要关闭的连接存放的数组。shrink中该数组中的连接都会被关闭掉。

activeConnections

Map<DruidPooledConnection, Object>

getConnection之后,存放的容器。

Druid各连接存储容器转换关系
Druid各连接存储容器转换关系

5.思考的问题

问题:既然poolingCount,和activeCount都与其容器的数量一致,为什么不直接使用数组的length或者map的size. 另外一个问题,为什么不使用类似于线程持的状态机。状态定义得比较混乱。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-11-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.统计类的计数器
  • 2.状态相关的计数器
  • 3.相关的判断逻辑:
  • 4.存储Connection的容器
  • 5.思考的问题
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档