druid1.2.8源码悦读:第五天

文章目录

  • druid1.2.8源码悦读:第五天
    • 一、回顾
    • 二、`dataSource.getConnectionDirect(maxWaitMillis)`
      • 2.1 进入一个无限循环:`for(;;)`
      • 2.2 调用`getConnectionInternal(maxWaitMillis)`
        • (1)根据maxWaitMillis创建`nanos`
        • (2)`connectCount++;`
        • (3)`takeLast();`
      • 2.3 `takeLast();`
        • (1)`emptySignal(); ` 唤醒CreateThread 创建线程池
        • (2)`notEmpty.await();` 让notEmpty等待,让创建线程的方法运行。
        • (3)从线程池中取出最后一个,并将最后一个位置设置为null

一、回顾

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

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来控制线程创建连接。

druid1.2.8源码悦读:第五天相关推荐

  1. 4月,诚邀你参加源码共读,学会看源码,打开新世界!开阔视野

    大家好,我是若川.很多关注我的新朋友可能不知道我组织了源码共读活动~ 也有很多人不知道我是谁.有人以为我是80后.有人以为我是全职自媒体等等.若川的 2021 年度总结,弹指之间 这篇文章写了我是16 ...

  2. 可能是全网首个前端源码共读活动,诚邀你加入一起学习

    大家好,我是若川.众所周知,从8月份开始,我组织了源码共读活动,每周学习200行左右的源码,到现在持续了3个多月,坚持答疑解惑.帮助了不少人,还是挺开心的.另外,涌现了很多优秀的读者朋友,比如有就职于 ...

  3. 3个多月,近3000人参与的源码共读,诚邀加入~

    大家好,我是若川.众所周知,从8月份开始,我组织了源码共读活动,每周学习200行左右的源码,到现在持续了3个多月,坚持答疑解惑.帮助了不少人,还是挺开心的.另外,涌现了很多优秀的读者朋友,投稿了很多优 ...

  4. 若川邀你进 源码共读 群~长期交流学习

    大家好,我是若川.这是一个愉快的周六~ 估计还是有很多读者不知道我.若川名字由来是取自:上善若水,海纳百川.顺便放两篇文章.我读源码的经历,跟各位读者朋友分享下公众号运营策略 加我微信进 源码共读 群 ...

  5. 祝大家七夕快乐,邀你源码共读,顺带发点红包

    大家好,我是若川.这是一个普通的周六.只不过又叫七夕节,祝大家七夕节快乐~所以就不更新技术文了. 估计还是有很多读者不知道我.若川名字由来是取自:上善若水,海纳百川.顺便放两篇文章.我读源码的经历,跟 ...

  6. Spark Mlib TFIDF源码详读 笔记

    2019独角兽企业重金招聘Python工程师标准>>> 在提取文本特征时,经常用到TF-IDF算法.Spark Mlib实现了该算法.下面是Spark Mlib中,TF_IDF算法调 ...

  7. 我和掘金合作的源码共读小册报名快1000人了~

    众所周知,我和掘金合作出了源码共读第一期.我是前端领读员.现在报名快1000人了~奖品丰厚. 也有一些小伙伴已经写了好几期笔记了~但相对1000人写的还是太少. 什么?你不知道?那也很正常,毕竟我的公 ...

  8. Linux驱动开发 / fbtft源码速读

    哈喽,老吴又来分享学习心得啦~ 一.目标与体系 目标是关于你想要达到的结果,而体系是涉及导致这些结果的过程; 目标的意义在于确定大方向,但体系才能促进进步.完全忽略目标,只关注体系,仍然会成功. 结果 ...

  9. 【Spring源码这样读】-怎么阅读源码

    做开发要不要读源码?如果你天天996,真心的不建议你去读源码(我是不介意做一个劝退师的).读源码确确实实是一个费时费力的活,如果你每天都很忙,偶尔看一眼,想了解其中的奥秘,这很难办到.那我们需不需要读 ...

最新文章

  1. 微软曾经的二号人物永远地离开了
  2. 我的Android进阶之旅------gt;怎样在多个LinearLayout中加入分隔线
  3. 计算机专业词典_好书优选:实用英汉汉英计算机词典
  4. Netty原理架构解析
  5. 剑指offer(12)旋转数组的最小数字
  6. 系统架构师 项目经理 哪个更有前景_中央空调加地暖与五恒系统,哪个更省钱?...
  7. linux shell 豆瓣,用Linux shell脚本爬取豆瓣邮箱
  8. 哈希表,哈希算法(C语言)
  9. 转lua解析脚本过程中的关键数据结构介绍
  10. 5.23考前友情提醒
  11. 排便的快感--不是非主流
  12. 新版quartus_prime破解与altera官网下载器件库
  13. Nmap支持的TCP / IP 系统指纹识别方法
  14. Grafana Tempo部署
  15. html页面的结构标记是什么意思,html页面的结构标记是什么
  16. 地理学中的经典统计分析方法
  17. java版我的世界MITE怎么下_MITE纯新手向教程 - [MITE]MC实在是太简单了 (Minecraft Is Too Easy) - MC百科|最大的Minecraft中文MOD百科...
  18. PCB设计之安规规范
  19. ​大佬,像这种国外创意PPT逻辑图,你能做出来吗?
  20. 服装办理erp体系的优点与选择

热门文章

  1. c++基础温习之指针分配空间
  2. ByRef和ByVal
  3. promise解决回调地狱(callback hell)
  4. 跨境电商B2B是什么?跨境电商B2B模式如何定义?
  5. Fresco的使用及圆角
  6. 12.2 数据库控制文件复制到ASM磁盘组
  7. 华为路由器命令手册_用数据说话,华为路由Q2 Pro与网件R7800对比测评
  8. Java 小白 设计加油站类和汽车类,加油站提供一个给车加油的方法,参数为剩余汽油数量。每次执行加油方法,汽车的剩余数量都会加2
  9. 面试AI算法岗,你被要求复现顶会论文了嘛?
  10. Elasticsearch7.8