连接池原理设计并不难

简介: 什么是连接? 连接,代表上游对下游的通信或会话。比如客户端连接服务器、服务器连接数据存储等
目录
  • 连接
  • 连接池产生原因
  • 连接池实现原理
  • 小结
一、连接

什么是连接?
连接,代表上游对下游的通信或会话。比如客户端连接服务器、服务器连接数据存储等

连接其通信的基本步骤,很类似 HTTP 操作:

1、上游对下游建立一个连接(客户端与服务器需要建立连接。比如点击某个超级链接)
2、上游通过连接,发送请求(建立连接后,客户端发送请求给服务器)
3、上游通过连接,收到响应(服务器接到请求后,响应其响应信息)
4、上游关闭连接,释放连接资源(客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接)

file

再深入点,HTTP 持久连接是什么?HTTP 持久连接是指用同一个 HTTP 底层的 TCP 连接来发送/接收多个 HTTP 请求/响应。扩展点,只需要在头部设置:

Connection: Keep-Alive

为什么要有持久连接?每次都是从建立连接开始也可以达到结果,并且最后是关闭连接释放资源。这就是引出连接池产生原因。

二、连接池产生原因

先看一下常见的 mysql-connector-java 包驱动下面 ConnectionImpl 源码:

trackConnection()

execSQL()
commit()

close()

对 MySQL 多半是进行连接(connection),增删改查并提交(execSQL、commit),关闭连接(close)操作,然后实现业务相关逻辑。其操作也很清晰:

1、建立连接
2、发送请求(数据的 CRUD 操作)
3、关闭连接

但,为啥会需要有连接池?
其实在业务量流量不大,并发量也不大的情况下,连接临时建立完全可以。
但并发量起来,达到百级、千级,其中建立连接、关闭连接的操作会造成性能瓶颈,所以得考虑连接池来优化上述 1 和 3 操作:

1、取出连接(业务服务启动时,初始化若干个连接,放在连接存储中)
2、发送请求(当有请求,从连接存储中中取出)
3、放回连接(执行完毕,连接放回连接存储中)

这里对连接存储的数据结构,并维护连接,就是连接池。

三、连接池实现原理

连接池原理,可以具体看下阿里巴巴 Druid 包的 DruidDataSource 源码:

DruidConnectionHolder[] connections;

createConnection()
getConnection()
recycle()

连接池实现原理也不难,DruidDataSource 即德鲁伊连接池,可以核心设计接口:

1、createConnection:服务启动 init ,会创建一批指定数量的连接放入 connections 数组
2、getConnection:这样每次请求,不会新建一个连接。而是从 DruidConnectionHolder[] connections 数组中取出一个连接
3、recycle:每次请求结束后,不是关闭连接,而是回收连接到 connections 数组

其中有个重入锁 ReetrantLock,具体作用如下:

  • 获取一个连接,锁住
  • 返回该连接,使用连接
  • 使用完毕,回收连接,并释放锁

image

四、小结

核心连接池也就这么点东西,具体还需要考虑其他点如下:

  • 连接池连接设计遵守 LRU 策略,性能的关键点是连接是否 LRU 方式重用。LRU 资料:https://yq.aliyun.com/articles/70456
  • 通过 Hash 去连接,实现串行化
  • 可以自动扩容连接数
  • 连接数过多,可以自动关闭连接,释放资源
  • 等等

文章来源:https://my.oschina.net/jeffli1993/blog/3029248

20181212_02

相关文章
|
开发框架 安全 前端开发
[ 代码审计篇 ] Java web 代码审计 详解(一)
之前写了一篇关于代码审计流程的文章,有小伙伴私聊我说不太好理解,这里开始介绍 Java web 的代码审计,同样的来捋一捋审计思路,这就相对要具体一些。
2306 0
[ 代码审计篇 ] Java web 代码审计 详解(一)
|
存储 安全 编译器
|
SQL 自然语言处理 关系型数据库
MySQL · 源码分析 · 词法分析及其性能优化
Table of Contents 1. 简介 2. 背景知识 3. 查找树的实现 3.1. 树的查找 3.2. 树的产生 4. 试试折半查找 5. 总结 简介 MySQL 支持标准的 SQL 语言,具体实现的时候必然要涉及到词法分析和语法分析。早期的程序可能会优先考虑手工实现词法分析和语法分析,现在大多数场合下都会采用工具来简化实现。MySQL、PostgreSQL 等
8928 0
|
NoSQL 关系型数据库 MySQL
你了解微服务的超时传递吗?
你了解微服务的超时传递吗?
|
算法 开发者 索引
【C++11算法】random_shuffle和shuffle
【C++11算法】random_shuffle和shuffle
690 0
|
弹性计算 运维 Linux
运维工程师必备的摸鱼神器:阿里云智能助手OS Copilot
OS Copilot 概述与体验评测摘要 阿里云的OS Copilot是一款基于大模型的智能操作系统助手,作为高级运维工程师,体验者发现它在系统诊断和性能优化上尤其有用,简化了如重置ECS密码和安全组配置等任务,提升了工作效率。 OS Copilot的易用性和安全性得到肯定,操作手册详细且交互性强,减少了用户在不同页面间切换的需要。在辅助编程方面,它能帮助非专业开发者编写和理解代码,对运维工作中的开发技能补充有很大帮助。与GitHub Copilot等产品相比,OS Copilot的独特之处在于结合了Linux操作的支持。
516 3
运维工程师必备的摸鱼神器:阿里云智能助手OS Copilot
|
监控 Linux
深入了解Linux的pmap命令:进程内存映射的利器
`pmap`是Linux下分析进程内存映射的工具,显示内存区域、权限、大小等信息。通过`/proc/[pid]/maps`获取数据,特点包括详细、实时和灵活。参数如`-x`显示扩展信息,`-d`显示设备。示例:`pmap -x 1234`查看进程1234的映射。注意权限、实时性和准确性。结合其他工具定期监控,排查内存问题。
|
Docker 容器
『Skywalking』在Docker中快速部署Skywalking
📣读完这篇文章里你能收获到 - 在Docker中快速部署Skywalking
3900 4
『Skywalking』在Docker中快速部署Skywalking
|
Java 关系型数据库 数据库连接
连接池的工作原理
连接池的工作原理

热门文章

最新文章