博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
连接池原理设计并不难
阅读量:5745 次
发布时间:2019-06-18

本文共 1442 字,大约阅读时间需要 4 分钟。

目录
  • 连接
  • 连接池产生原因
  • 连接池实现原理
  • 小结
一、连接

什么是连接?

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

连接其通信的基本步骤,很类似 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 资料:
  • 通过 Hash 去连接,实现串行化
  • 可以自动扩容连接数
  • 连接数过多,可以自动关闭连接,释放资源
  • 等等

文章来源:

20181212_02

转载地址:http://boazx.baihongyu.com/

你可能感兴趣的文章
Js中this机制全解
查看>>
VS扩展异常(未解决)
查看>>
数据结构上机实验之二分查找
查看>>
JAVA获取一个图片路径后,下载该图片再重新上传至指定路径中
查看>>
angularJS中XHR与promise
查看>>
linux命令之 df file fsck fuser
查看>>
DP SRM 661 Div2 Hard: ColorfulLineGraphsDiv2
查看>>
2017-4-21 ADO.NET的六大对象
查看>>
按之字形顺序打印二叉树
查看>>
oracle日期函数转换真麻烦。。。
查看>>
java jdk动态代理(proxy)
查看>>
python3.3链接mysql5.1
查看>>
Asp.net MVC + Redis(Linux安装Redis)
查看>>
Linux练习(读取改变环境变量)
查看>>
应用程序中的服务器错误。法向会话状态服务器发出会话状态请求--解决办法...
查看>>
让你提前认识软件开发(42):性能測试
查看>>
IDA Pro基本简介
查看>>
ADC for programmable logic uses one capacitor
查看>>
Winform开发框架之存储过程的支持--存储过程的实现和演化提炼(2)
查看>>
rabbitmq server的安装以及常用的命令
查看>>