【手写系列】理解数据库连接池底层原理之手写实现
前言
数据库连接池的基本思想是:为数据库连接建立一个“缓冲池”,预先在池中放入一定数量的数据库连接管道,需要时,从池子中取出管道进行使用,操作完毕后,再将管道放入池子中,从而避免了频繁的向数据库申请资源,释放资源带来的性能损耗。在如今的分布式系统当中,系统的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测试
运行结果
手写系列相关爆文
【手写系列】写出我的第一个框架:迷你版Spring MVC
【手写系列】透彻理解Spring事务设计思想之手写实现
【手写系列】透彻理解MyBatis设计思想之手写实现
【手写系列】纯手写实现一个高可用的RPC
【手写系列】对HashMap的思考及手写实现
【手写系列】纯手写实现JDK动态代理
【手写系列】写一个迷你版的Tomcat
作者:张丰哲
链接:https://www.jianshu.com/p/a50f614571e3
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
【手写系列】理解数据库连接池底层原理之手写实现相关推荐
- 【手写系列】对HashMap的思考及手写实现
前言 HashMap是Java中常用的集合,而且HashMap的一些思想,对于我们平时解决业务上的一些问题,在思路上有帮助,基于此,本篇博客将分析HashMap底层设计思想,并手写一个迷你版的Hash ...
- 使用代理模式手写简单的数据库连接池
使用代理模式手写简单的数据库连接池 JDBC直连数据库 思考 改造 ConnectionProxy ConnectionPool ProxyMain 运行结果 代理模式 与装饰器的区别 JDBC直连数 ...
- 面试官:谈谈数据库连接池的原理
来源:https://dwz.cn/oUF6pKOW 这次我们采取技术演进的方式来谈谈数据库连接池的技术出现过程及其原理,以及当下最流行的开源数据库连接池jar包. 一.早期我们怎么进行数据库操作 1 ...
- 3 连接sybase_今日头条面试官:给我说说数据库连接池的原理?
作者:敦格 来源:https://urlify.cn/ABJbum 这次我们采取技术演进的方式来谈谈数据库连接池的技术出现过程及其原理,以及当下最流行的开源数据库连接池jar包. # 早期我们怎么进行 ...
- 【MySQL】数据库连接池的原理及实现
本专栏将从基础开始,循序渐进,讲解数据库的基本概念以及使用,希望大家都能够从中有所收获,也请大家多多支持. 专栏地址: 数据库必知必会 相关软件地址:软件地址 如果文章知识点有错误的地方,请指正!大家 ...
- 谈谈数据库连接池的原理
这次我们采取技术演进的方式来谈谈数据库连接池的技术出现过程及其原理,以及当下最流行的开源数据库连接池jar包. 一.早期我们怎么进行数据库操作 1.原理:一般来说,java应用程序访问数 ...
- 并发编程五:java并发线程池底层原理详解和源码分析
文章目录 java并发线程池底层原理详解和源码分析 线程和线程池性能对比 Executors创建的三种线程池分析 自定义线程池分析 线程池源码分析 继承关系 ThreadPoolExecutor源码分 ...
- 手写识别底层原理_LinkedList底层原理和手写单链表
2.1 单链表技能点 · 认识单链表 o 特点 数据元素的存储对应的是不连续的存储空间,每个存储结点对应一个需要存储的数据元素. 每个结点是由数据域和指针域组成. 元素之间的逻辑关系通过存储节点之间的 ...
- 19.Atomic系列之LongAdder的底层原理(分段锁提升并发性能)
老王:小陈啊,上一章我们讲解了cas的缺陷,无法同时更新多个变量.以及ABA的问题.以及如果使用AtomicReference解决同时更新多个变量,如果使用AtomicStampedReference ...
最新文章
- MyBatis1:MyBatis入门
- Linux - 搭建FastDFS分布式文件系统
- git clone时出现 error:inflate:data stream error(incorrect data check)
- jpg图片使用pil的resize后_如何使用PIL调整图像大小并保持其纵横比?
- java---sychronized的深入理解
- rsync同步服务部署
- awk命令和grep命令的使用
- C++实现简单的二叉树
- 【B/S】ASP.NET---验证码-生成和切换
- 深入学习golang—channel
- cdlinux U盘启动制作方法
- 8.10 网络编程——客户端从服务器中下载文件 TFTP协议
- Android RecyclerView优雅实现复杂列表布局(二)
- 粤嵌实习-linux下madplay播放器的下载和使用、线程的介绍和创建一个广告循环播放线程
- Linux iptables 防火墙相关资料
- 由于使用计算机编制会计报表,《计算机会计学》1
- 解决Win10锁屏超1分钟,显示器关闭问题
- 『译』计算机体系结构发展史(四)
- _access()函数的使用
- osgEarth示例分析——osgearth_los