理解数据库连接池底层原理之手写实现

前言

数据库连接池的基本思想是:为数据库连接建立一个“缓冲池”,预先在池中放入一定数量的数据库连接管道,需要时,从池子中取出管道进行使用,操作完毕后,在将管道放入池子中,从而避免了频繁的向数据库申请资源,释放资源带来的性能损耗。在如今的分布式系统当中,系统的QPS瓶颈往往就在数据库,所以理解数据库连接池底层构造原理与设计思想是很有益处的。我们常用的数据库连接池有C3P0,DBCP,Druid等,下面我们就来分析下数据库连接池应该有些什么,以及手写一个迷你版的数据库连接池!

对数据库连接池的一点思考

第一,数据库连接池中存放的就是数据库操作管道,不仅仅是存放,而且应该是管理这些管道; 第二,应该提供外部配置文件去初始化数据库连接池; 第三,如果一个数据库操作管道已经被占用,那么其他请求是否应该得到这个管道,也就是说我们要考虑多线程并发下,管道的分配问题; 第四,如果做到管道的复用?放回池子中,标示可用,并不是真正的关闭管道;

写一个迷你版数据库连接池

IMyPool是一个接口,对外提供数据库连接池的基本服务,比如得到一个数据库操作管道。 MyDefaultPool是IMyPool的实现。 MyPooledConnection代表数据库操作管道,它可以执行SQL,关闭管道等。 MyPoolFactory是一个工厂,单例模式,用于得到IMyPool实现。 DBConfigXML代表外部配置文件。 Test用于测试。

DBConfigXML

我们在实际中使用数据库连接池,需要在Spring的配置文件中,进行一些参数配置。这里,为了简化解析,直接提供。

MyPooledConnection

所谓数据库连接管道,就是对JDBC Connection进行封装而已,但是需要注意isBusy的这个标示。对管道的关闭,实际上只是标示的改变而已!

IMyPool

MyDefaultPool

需要注意到是,MyDefaultPool持有一个管道集合,基于多线程的考虑,这里使用了Vector。

MyDefaultPool需要初始化

数据库连接池需要根据外部配置文件完成数据库驱动加载以及初始化管道的建立。

createMyPooledConnection接口实现

数据库连接池在创建管道时,应该去看一下是否达到上限,如果没有,则可以创建。 不仅仅要创建出来,还要标示每一个管道的isBusy标志。

getMyPooledConnection接口实现

这里需要注意的是:如果得不到操作管道,需要去创建管道!

getRealConnectionFromPool

第一,这里使用了synchronized,就是为了避免多线程下产生问题。 第二,要知道Connection是有超时机制的,如果我们得到的管道的Connection已经超时了怎么办呢? 第三,得到管道后,一定注意isBusy的设置。

MyPoolFactory

Test测试

运行结果

好了,到这里,一个迷你版的数据库连接池就有模有样了!

如果觉得我的分享不错,欢迎大家随手点赞、转发。

本文分享自微信公众号 - Java团长(javatuanzhang)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-08-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

博君一笑

9620
来自专栏java一日一条

我的编码习惯 - 参数校验和国际化规范

今天我们说说参数校验和国际化,这些代码没有什么技术含量,却大量充斥在业务代码上,很可能业务代码只有几行,参数校验代码却有十几行,非常影响代码阅读,所以很有必要把...

12810
来自专栏java一日一条

华为、腾讯、阿里、网易员工下班时间大曝光,为什么赢不了他们

这年头,不加班都不好意思说自己是上班族的。但有一种行业的疯狂加班程度,已经逐渐成为加班领域的一颗新星——互联网行业从事者!

15030
来自专栏java一日一条

编程,从来都不晚:来自日本的82岁APP开发者

82岁的若宮正子第一次工作时,还是使用算盘来进行计算——而如今,她是世界上年纪最大的iPhone应用开发者之一,也是使得智能手机走入老年人生活的先驱者。

15220
来自专栏金融民工小曾

电商平台分账交易是怎么做的?

另一篇文章讲到了电商平台的“二清”模式,在实际中,很多互联网电商平台需要分账给上面的平台商户或者其他角色,如果从严格的“二清”界定上来讲部分是属于违规进行了“信...

28510
来自专栏程序员的知识天地

阿里员工揭秘:很多程序员离职,在小公司当领导,只动嘴不动手!

阿里巴巴是中国知名的互联网公司,每个人或多或少的都从淘宝上购买的物品,自从1998年成立到现在,里面人才济济,里面的程序员不仅工资非常的高,不少程序员年收入竟然...

16620
来自专栏java一日一条

华为加班到底有多恐怖?

“我先说一下我的吧。昨天晚上好不容易11点之前搞完上线回到家,刚开门媳妇就叫到:你TMD给我站到阳台去!”

1.3K20
来自专栏java一日一条

盲式出轨,上流社会边缘人士,2018朋友圈流行词,哪个词说中了你?

11830
来自专栏java一日一条

面试中单例模式有几种写法

纠结单例模式有几种写法有用吗?有点用,面试中经常选择其中一种或几种写法作为话头,考查设计模式和coding style的同时,还很容易扩展到其他问题。这里讲解几...

12270
来自专栏程序员的知识天地

这些拍案惊奇的智障桥段,分明是在蔑视我作为程序员的debug

作为在网络高速发展的时代背景下成长起来的一代人,网络文学几乎伴随着我们的整个青春。

13020

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励