泥瓦匠进阶:连接池原理设计并不难
原理 设计 进阶 连接池 不难
2023-09-14 08:58:47 时间
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢!
目录
- 连接
- 连接池产生原因
- 连接池实现原理
- 小结
TEMPERANCE:Eat not to dullness;drink not to elevation.
节制:食不过饱,饮不过量。
一、连接
什么是连接?
连接,代表上游对下游的通信或会话。比如客户端连接服务器、服务器连接数据存储等
连接其通信的基本步骤,很类似 HTTP 操作:
- 上游对下游建立一个连接(客户端与服务器需要建立连接。比如点击某个超级链接)
- 上游通过连接,发送请求(建立连接后,客户端发送请求给服务器)
- 上游通过连接,收到响应(服务器接到请求后,响应其响应信息)
- 上游关闭连接,释放连接资源(客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接)
再深入点,HTTP 持久连接是什么?HTTP 持久连接是指用同一个 HTTP 底层的 TCP 连接来发送/接收多个 HTTP 请求/响应。扩展点,只需要在头部设置:
Connection: Keep-Alive
为什么要有持久连接?每次都是从建立连接开始也可以达到结果,并且最后是关闭连接释放资源。这就是引出连接池产生原因。
二、连接池产生原因
先看一下常见的 mysql-connector-java 包驱动下面 ConnectionImpl
源码:
trackConnection()
execSQL()
commit()
close()
对 MySQL 多半是进行连接(connection),增删改查并提交(execSQL、commit),关闭连接(close)操作,然后实现业务相关逻辑。其操作也很清晰:
- 建立连接
- 发送请求(数据的 CRUD 操作)
- 关闭连接
但,为啥会需要有连接池?
其实在业务量流量不大,并发量也不大的情况下,连接临时建立完全可以。
但并发量起来,达到百级、千级,其中建立连接、关闭连接的操作会造成性能瓶颈,所以得考虑连接池来优化上述 1 和 3 操作:
- 取出连接(业务服务启动时,初始化若干个连接,放在连接存储中)
- 发送请求(当有请求,从连接存储中中取出)
- 放回连接(执行完毕,连接放回连接存储中)
这里对连接存储的数据结构,并维护连接,就是连接池。
三、连接池实现原理
连接池原理,可以具体看下阿里巴巴 Druid 包的 DruidDataSource
源码:
DruidConnectionHolder[] connections;
createConnection()
getConnection()
recycle()
连接池实现原理也不难,DruidDataSource 即德鲁伊连接池,可以核心设计接口:
- createConnection:服务启动 init ,会创建一批指定数量的连接放入 connections 数组
- getConnection:这样每次请求,不会新建一个连接。而是从 DruidConnectionHolder[] connections 数组中取出一个连接
- recycle:每次请求结束后,不是关闭连接,而是回收连接到 connections 数组
其中有个重入锁 ReetrantLock,具体作用如下:
- 获取一个连接,锁住
- 返回该连接,使用连接
- 使用完毕,回收连接,并释放锁
四、小结
核心连接池也就这么点东西,具体还需要考虑其他点如下:
- 连接池连接设计遵守 LRU 策略,性能的关键点是连接是否 LRU 方式重用。LRU 资料:https://yq.aliyun.com/articles/70456
- 通过 Hash 去连接,实现串行化
- 可以自动扩容连接数
- 连接数过多,可以自动关闭连接,释放资源
- 等等
![](http://www.bysocket.com/wp-content/uploads/2017/01/qrcode_for_gh_cd421e7eb7d6_430.jpg)
(关注微信公众号,领取 Java 精选干货学习资料)
相关文章
- 哈希表的实现和HashMap的原理
- 深入理解 MySQL 索引底层原理
- MapReduce原理与设计思想
- [Proxy Auto Config]GoogleWebAccelerator用的Proxy.pac代理原理介绍
- 描述一下JVM加载class文件的原理机制?
- SAP Fiori和WebClient UI的有状态和无状态行为设计原理
- SAP 电商云 Spartacus UI 的 feature module 设计原理
- SAP 电商云 Spartacus UI 页面布局的设计原理
- SAP Spartacus B2B模块 State的设计原理
- SAP Spartacus B2B页面Budget页面的设计原理
- SAP Spartacus 重用组件cx-table的设计原理
- SAP Spartacus里的HTTPErrorInterceptor的单元测试设计原理
- Angular ngIf 指令的工作原理
- 浅谈电商网站开发中用户会话管理机制的设计和实现原理
- SAP CRM CUSTOMER_H扩展字段的设计原理
- SQL Select查询原理--查询语句执行原则(基础)
- Atitit 单片机与嵌入式系统原理与概念 目录 1. 寄存器、数据库,堆栈2 1.1. 寻址模式2 1.2. 指令2 1.3. Watchdog 中断2 2. 软件是如何影响硬件设计的2
- Atitit.html css 浏览器原理理论概论导论attilax总结
- Atitit ati licenseService 设计原理
- Atitit.Base64编码原理与实现设计
- Atitit.木马病毒 webftp 的原理跟个设计
- Atitit。Time base gc 垃圾 资源 收集的原理与设计
- Atitit. 单列索引与多列索引 多个条件的查询原理与设计实现
- Atitit.字节数组转字符串 base64 base16 Quoted-printable 编码原理设计 attilax 总结
- 【Go进阶】Goroutine 实现原理
- 【Android 热修复】热修复原理 ( 多 Dex 打包机制 | 多 Dex 支持 | Dex 分包设置 | 开发和产品风格设置 | 源码资源 )
- golang goroutine实现_golang中的Mutex设计原理详解(一)
- 数据库原理及安全(二)