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

前言

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

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

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

第一,数据库链接池中存放的就是数据库操做管道,不单单是存放,并且应该是管理这些管道;多线程

第二,应该提供外部配置文件去初始化数据库链接池;并发

第三,若是一个数据库操做管道已经被占用,那么其余请求是否应该获得这个管道,也就是说咱们要考虑多线程并发下,管道的分配问题;分布式

第四,若是作到管道的复用?放回池子中,标示可用,并非真正的关闭管道;ide

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

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

IMyPool是一个接口,对外提供数据库链接池的基本服务,好比获得一个数据库操做管道。性能

MyDefaultPool是IMyPool的实现。测试

MyPooledConnection表明数据库操做管道,它能够执行SQL,关闭管道等。ui

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测试

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

运行结果

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

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

相关文章
相关标签/搜索