druid获取连接时序图
2024-04-01 15:47:15 5 举报
Druid是一个针对数据库访问的JDBC封装器,负责处理连接池管理、SQL拦截等功能。在获取数据库连接时,Druid会经历以下步骤: 1. 连接池初始化:首先,Druid会创建一个连接池,并对连接池的相关参数(如连接数、超时时间等)进行配置。 2. 连接获取:当应用程序需要访问数据库时,会从连接池中获取一个空闲连接。连接池会使用一个FIFO的队列来管理连接的状态,避免同一时间大量请求导致的系统压力。 3. 数据库连接:连接池会与数据库建立连接,并进行身份验证。在这个过程中,Druid会对连接的超时时间、连接数等进行监控和管理。 4. SQL执行:在获取连接后,应用程序会向数据库发送SQL请求。Druid会通过SQL拦截器对SQL进行解析、优化和监控。 5. 结果返回:数据库执行完SQL后,会将结果返回给应用程序。Druid在这个过程中会对返回结果进行封装和处理。 6. 连接释放:在应用程序不再需要数据库连接时,Druid会将该连接释放回连接池,以便其他请求可以再次使用。 这份时序图展示了Druid在获取数据库连接时,各个模块之间的相互作用和依赖关系,涵盖了连接池初始化、连接获取、数据库连接、SQL执行、结果返回和连接释放等关键步骤。
作者其他创作
大纲/内容
复制连接,将原数组中后面不需要检查的连接,放入数组的前面,后面原有的位置,赋值成null
针对活动连接的销毁
sleep(timeBetweenEvictionRunsMillis)
return null;
lock
true
estimate <= 0?
poolingCount--;返回最后一个连接
CreateConnectionThread
等待空信号释放锁
DestroyConnectionThread
idleMillis >= minEvictableIdleTimeMillis?evictList.add
timeMillis >= removeAbandonedTimeoutMillis
timeBetweenEvictionRunsMillis > 0?
for :abandonedList关闭连接
connectCount++
等待非空信号更新剩余时间estimate
getConnectionDirect
pollLast
unlock
for(i in checkCount)
new abandonedList
获取lock锁
poolingCount >= notEmptyWaitThreadCount?
从池头获取连接大于空闲时间加入list中
getConnectionInternal
empty.signal()
synchronized (activeConnections)
ReentreenLock
发出不为空信号
throw Exception(timeout or createErroe )
notEmpty.signal
checkCount = poolingCount - minIdle;
poolingCount == 0?
activeCount + poolingCount >= maxActive
false
shrink(true)
针对空闲连接的销毁
poolingCount == 0&& estimate<=0?
connectedTimeNano:获取连接的时候设置的时间戳
释放锁
EmptyCondition
hold==null?
放入连接池最后一个
发送空信号,并且释放锁
notEmpty.awaitNanos
main
removeAbandoned
iter.remove();abandonedList.add;
empty.await()
防止创建超过maxActive数量的连接
for activeConnections
Thread.sleep(1000);
createPhysicalConnection
获取锁
创建连接
getConnection
死循环
NotEmptyCondition
return null
evicList.size = 2poolCount = 5
isRemoveAbandoned()? removeAbandoned();
empty.await();
包装连接DruidConnectionHolder
start
init
new evictList
holder.incrementUseCount()return connection
必须存在线程等待,才创建连接
for死循环
收藏
0 条评论
下一页