前言数据库连接池的基本思想是:为数据库连接建立一个“缓冲池”,将一定数量的数据库连接管道放入预先将水池中,必要时从水池中取出管道备用。操作完成后,将管道放入池中,从而避免频繁向数据库申请资源和释放资源带来的性能损失。在当今的分布式系统中,系统的QPS瓶颈往往出在数据库上,因此了解数据库连接池的底层构建原理和设计思路是非常有好处的。我们常用的数据库连接池有C3P0、DBCP、Druid等,接下来我们来分析一下数据库连接池应该有什么,写一个迷你版的数据库连接池!关于数据库连接池***的一些思考,数据库操作管道存放在数据库连接池中,不仅是为了存储,也是为了管理这些管道;其次,应该提供一个外部配置文件来初始化数据库连接池;第三,如果一个数据库操作管道已经被占用,其他请求是否应该获取这个管道,也就是说,我们需要考虑多线程并发下管道的分配;四、是否可以复用管道?将其放回池中并将其标记为可用并不会真正关闭管道;编写一个迷你版的数据库连接池IMyPool是一个接口,对外提供数据库连接池的基本服务,比如获取数据库操作管道。MyDefaultPool是IMyPool的一个实现。MyPooledConnection代表数据库操作管道,可以执行SQL,关闭管道等。MyPoolFactory是一个工厂,单例模式,用于获取IMyPool的实现。DBConfigXML代表一个外部配置文件。测试用于测试。DBConfigXML我们在实践中使用数据库连接池,需要在Spring配置文件中配置一些参数。这里为了简化解析,直接提供。MyPooledConnection所谓数据库连接管道,就是对JDBCConnection进行封装,但是需要注意isBusy的标记。管道的关闭,其实只是标签的改变而已!IMyPoolMyDefaultPool需要注意的是,MyDefaultPool持有一个管道集合。基于多线程的考虑,这里使用了Vector。MyDefaultPool需要初始化。数据库连接池需要根据外部配置文件完成数据库驱动的加载和初始化管道的建立。CreateMyPooledConnection接口实现在为数据库连接池创建管道时,应检查是否已达到上限。如果没有,您可以创建它。不仅要创建,还要标记每个管道的isBusy标志。getMyPooledConnection接口的实现这里需要注意的是:如果获取不到操作管道,需要创建管道!getRealConnectionFromPool***,这里使用synchronized,避免多线程下出现问题。其次,我们要知道Connection是有超时机制的。如果我们获取到的pipeline的Connection超时了怎么办?三、拿到管道后,一定要注意isBusy的设置。MyPoolFactoryTest测试运行结果了解数据库连接池的底层原理。
