这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战
简介
本文在之前文章Druid使用流程文章基础下,来实现在多线程请求下的数据库连接池初步Demo,实现一个多线程下能跑的最基础版本
探索Alibaba Druid的物理连接生成
参考Alibaba Druid数据库的实现:Alibaba Druid 源码阅读(六)数据库连接使用流程初探
我们主要的实现思路如下:
- 1.初始化配置的初始物理连接数
- 2.获取连接时,从空闲线程池中阻塞获取
- 3.获取连接时,发送生成物理连接指令去生成新的物理连接,但物理连接数不得大于配置的最大连接数
- 4.连接关闭时,归还空闲线程池
在Alibaba Druid中是使用等待-通知机制来阻塞获取的,我们简单点,就用一个阻塞队列实现这个
1.初始化生成配置初始化数据的物理连接
先简单直接的在构造函数中生成,并将其放入空闲池中:
1 | java复制代码public class SelfDataSource implements DataSource { |
2.从池中获取物理连接
获取连接时,从空闲池中进行获取,返回活跃使用池中:
1 | java复制代码public class SelfDataSource implements DataSource { |
3.回收连接
将连接从使用活跃池中移除,放入空闲池中:
1 | java复制代码public class SelfDataSource implements DataSource { |
4.测试运行
测试的代码如下:
1 | java复制代码public class MultiThreadSelfTest { |
结果及分析如下:
1 | tex复制代码// 生成最初的五个物理连接 |
总结
运行结果看起来大致符合我们的预期,但总感觉还有有一些不对劲的地方,现在暂时还看不出来
下面还有一些未完成的:
- 最小空闲线程数的实现
- 动态线程的生成
后面继续完善吧,还有就是和Alibaba Druid的运行对比,这些后面继续写和研究
代码参考地址,可查看Tag V0.0.1:github.com/lw124392545…
参考链接
- Alibaba Druid 源码阅读(一) 数据库连接池初步
- Alibaba Druid 源码阅读(二) 数据库连接池实现初步探索
- Alibaba Druid 源码阅读(三) 数据库连接池初始化探索
- Alibaba Druid 源码阅读(四) 数据库连接池中连接获取探索
- Alibaba Druid 源码阅读(五)数据库连接池 连接关闭探索
- Alibaba Druid 源码阅读(六)数据库连接使用流程初探
- 数据库连接池Demo(1)单线程初步
本文转载自: 掘金