druid1.2.8源码悦读:第五天

本文深入剖析了Druid 1.2.8版本中数据库连接池的获取过程,重点讲解了`getConnectionDirect()`方法的内部实现,包括无限循环等待、连接计数、线程池的控制以及`takeLast()`方法中的线程唤醒与等待策略。通过多线程和锁机制,Druid确保了高效且安全的数据库连接管理。
摘要由CSDN通过智能技术生成

druid1.2.8源码悦读:第五天

一、回顾

在第四天,阅读了通过过滤链创建数据库连接池的骨架,过滤器通过递归的方式不在在连接上增强,而底层调用的是:

DruidPooledConnection connection = dataSource.getConnectionDirect(maxWaitMillis);

二、dataSource.getConnectionDirect(maxWaitMillis)

2.1 进入一个无限循环:for(;;)

进入一个无限循环。

2.2 调用getConnectionInternal(maxWaitMillis)

获取一个内部连接。

默认maxWaitMillis值为-1,也就是说,可以无限时间的等待,直到建立数据库连接。

(1)根据maxWaitMillis创建nanos

maxWaitMillis 的单位是毫秒,最大等待时间。将这个时间转换成纳秒

final long nanos = TimeUnit.MILLISECONDS.toNanos(maxWait);
(2)connectCount++;
connectCount++;
(3)takeLast();
DruidConnectionHolder holder = takeLast();

2.3 takeLast();

(1)emptySignal(); 唤醒CreateThread 创建线程池
(2)notEmpty.await(); 让notEmpty等待,让创建线程的方法运行。
(3)从线程池中取出最后一个,并将最后一个位置设置为null
DruidConnectionHolder last = connections[poolingCount];
connections[poolingCount] = null;
return last;

发现,这里创建线程池,使用到了多线程。并且创建数据库连接的线程是在init()中初始化的。通过lock、empty、notempty来控制线程创建连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值