2019独角兽企业重金招聘Python工程师标准>>>

摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢!

目录

  • 连接
  • 连接池产生原因
  • 连接池实现原理
  • 小结

TEMPERANCE:Eat not to dullness;drink not to elevation.
节制:食不过饱,饮不过量。

一、连接

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

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

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

再深入点,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,具体作用如下:

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

四、小结

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

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

 
(关注微信公众号,领取 Java 精选干货学习资料)

转载于:https://my.oschina.net/jeffli1993/blog/3029248

泥瓦匠进阶:连接池原理设计并不难相关推荐

  1. java设计高并发内存池_高并发服务器-连接池的设计

    高并发服务器-连接池的设计 高并发服务器需要有一些池的设计,如内存池,连接池,数据库连接池. 池(pool)的设计主要考虑到一些资源的频繁申请和释放,尤其是在高并发的服务器中,几万甚至几十万并发每秒, ...

  2. 数据库:数据库的连接池原理及实现

    对于一个简单的数据库应用,由于对于数据库的访问不是很频繁.这时可以简单地在需要访问数据库时,就新创建一个连接,用完后就关闭它,这样做也不会带来什么明显的性能上的开销.但是对于一个复杂的数据库应用,情况 ...

  3. 基于HiKariCP组件,分析连接池原理

    池塘里养:Connection: 一.设计与原理 1.基础案例 HiKariCP作为SpringBoot2框架的默认连接池,号称是跑的最快的连接池,数据库连接池与之前两篇提到的线程池和对象池,从设计的 ...

  4. 连接池原理介绍+常用连接池介绍

    下面以访问MySQL为例,执行一个SQL命令,如果不使用连接池,需要经过哪些流程. 不使用数据库连接池的步骤: TCP建立连接的三次握手 MySQL认证的三次握手 真正的SQL执行 MySQL的关闭 ...

  5. python连接池原理_python redis之连接池的原理

    python redis之连接池的原理 什么是连接池 通常情况下, 当我们需要做redis操作时, 会创建一个连接, 并基于这个连接进行redis操作, 操作完成后, 释放连接, 一般情况下, 这是没 ...

  6. 深入理解Spring Boot数据源与连接池原理

    ​ Create by yster@foxmail.com 2018-8-2 一:开始 在使用Spring Boot数据源之前,我们一般会导入相关依赖.其中数据源核心依赖就是spring‐boot‐s ...

  7. golang mysql连接池原理_redis mysql 连接池 之 golang 实现

    1 mysql 连接池代码 package lib import ( "database/sql" "fmt" "strconv" &quo ...

  8. golang mysql连接池原理_[Go] golang实现mysql连接池

    golang中连接mysql数据库,需要使用一个第三方类库github.com/go-sql-driver/mysql,在这个类库中就实现了mysql的连接池,并且只需要设置两个参数就可以实现 一般连 ...

  9. # 再次尝试 连接失败_新一代高效连接池HikariCP设计简要分析

    1 概述 应用程序建立与数据库的连接其实是一项开销很大的工作,其中涉及网络连接的建立.会话的建立.数据库端与应用程序的适配等诸多操作.因此,大部分情况下我们会选择将数据库连接进行池化管理. 连接池基本 ...

最新文章

  1. [转]SAP FI/CO 模块设置
  2. Canvas 属性,方法
  3. SecureCRT 7.3.4 安装以及破解
  4. 网络安全应急响应-常用工具
  5. 小爱音箱 电脑 麦克风_小米发布两款小爱音箱新品:发力音质,加入蓝牙网关...
  6. Freeswitch 怎么配置 Proxy Media 和 bypass 模式
  7. Spark的lazy特性有什么意义呢?
  8. 无人机生成地图_无人机配方向传感器可自行创建地图+规划路线
  9. 基于麻雀算法的无人机航迹规划 - 附代码
  10. vue 根据身份证号获取性别,年龄,出生年月
  11. wallpaper设置壁纸图片被拉伸
  12. 电磁场与电磁波实验 02 - | 电磁波波长测试实验
  13. 用fread()和fwrite()读写文件
  14. win2008文件上传服务器,win2008文件上传到ftp服务器
  15. C语言求一万以内的超级素数,用C语言求素数的优化.doc
  16. Android 仿HTC拉环解锁波浪效果
  17. 水工建筑物类毕业论文文献包含哪些?
  18. 大数据批量处理神器 - 自定义周期批量消费队列的实现
  19. 华为NCE网管配置EVPL业务(共享VCTrunk)之单站法
  20. 掌握14种UML图,清晰图示

热门文章

  1. RHEL6.4更改为CentOS6.4的yum源
  2. Jquery Uploadify3.21.与2.1版本 使用中存在的问题--记录三
  3. [转]《我眼中的技术高手》——邯郸学步、创作与创新
  4. ipv4 帧中继配置(GNS3)
  5. 关于MySQL内核,一定要知道的!
  6. jenkins配置权限不对导致无法登陆或者空白页面解决办法
  7. 爬取校园新闻首页的新闻
  8. ps aux与ps -ef的区别
  9. Windows系统 配置Java的JDK环境变量
  10. 关于项目数据库设计--投票系统