当前位置: 首页 > news >正文

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

前言

数据库连接池的基本思想是:为数据库连接建立一个“缓冲池”,预先在池中放入一定数量的数据库连接管道,需要时,从池子中取出管道进行使用,操作完毕后,在将管道放入池子中,从而避免了频繁的向数据库申请资源,释放资源带来的性能损耗。在如今的分布式系统当中,系统的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测试

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

运行结果

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

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

相关文章:

  • python结巴(jieba)分词
  • [svc]ssh+gg二步认证
  • 文件上传到oss代码片段
  • Idea卡在Maven导入工程
  • 学习笔记 - Git
  • forget word out a~2
  • SSM-MyBatis-18:Mybatis中二级缓存和第三方Ehcache配置
  • 34.CSS传统布局【上】
  • 测试同学难道要写一辈子的hello world?
  • 扒一扒AR增强现实技术的专利态势
  • oracle em 5500访问问题
  • 笔记 OSPF多区域配置 STUB区域 路由重分发 NSSA区域配置
  • apache+tomcat配置负载均衡,实现http与websocket接口分压
  • C 语言整型谜题
  • React Router v4 学习笔记
  • 【347天】每日项目总结系列085(2018.01.18)
  • Invalidate和postInvalidate的区别
  • java2019面试题北京
  • JS 面试题总结
  • Js基础知识(一) - 变量
  • js写一个简单的选项卡
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Next.js之基础概念(二)
  • PHP变量
  • Quartz初级教程
  • session共享问题解决方案
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 从setTimeout-setInterval看JS线程
  • 分享一份非常强势的Android面试题
  • 关于List、List?、ListObject的区别
  • 欢迎参加第二届中国游戏开发者大会
  • 回顾2016
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 我的面试准备过程--容器(更新中)
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 一个完整Java Web项目背后的密码
  • 用jquery写贪吃蛇
  • FaaS 的简单实践
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (Note)C++中的继承方式
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (三)uboot源码分析
  • (三十五)大数据实战——Superset可视化平台搭建
  • (五)IO流之ByteArrayInput/OutputStream
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .aanva
  • .gitignore文件—git忽略文件