您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

连接池居然这么简单?

时间:2019-10-22 10:28:49  来源:  作者:

《“ID串行化”保证群消息顺序性》提到,可以通过连接池的改造,实现ID串行化,本篇讲讲连接池的原理,以及实现细节。

 

通常如何通过连接访问下游?

工程架构中有很多访问下游的需求,下游包括但不限于服务/数据库/缓存,其通讯步骤是为:

(1)与下游建立一个连接;

(2)通过这个连接,收发请求;

(3)交互结束,关闭连接,释放资源;

 

不管是服务/数据库/缓存,官方会提供不同语言的Driver、Document、DemoCode来指导使用方建立连接与调用接口。

以MongoDB的C++官方DriverAPI为例:

DBClientConnection* c = new DBClientConnection();

c->connect(“127.0.0.1:8888”);

c->insert(“db.s”, BSON(”shenjian”));

c->close();

画外音:建立连接、发送请求、关闭连接,都非常清晰。

 

「转」连接池居然这么简单?

 

 

这个DBClientConnection就是一个与MongoDB的连接,官方Driver通过它提供了若干API,让用户可以对MongoDB进行连接,增删查改,关闭的操作,从而实现不同的业务逻辑。

 

为什么需要连接池?

当并发量很低的时候,连接可以临时建立,但当服务吞吐量达到几百、几千的时候,建立连接connect和销毁连接close就会成为瓶颈,此时该如何优化呢?

(1)当服务启动的时候,先建立好若干连接Array[DBClientConnection];

(2)当请求到达的时候,再从Array中取出一个,执行下游操作,执行完放回;

从而避免反复的建立和销毁连接,以提升性能。

而这个对Array[DBClientConnection]进行维护的数据结构,就是连接池。

有了连接池之后,数据库操作的伪代码变为:

DBClientConnection* c =

ConnectionPool::GetConnection();

c->insert(“db.s”, BSON(”shenjian”));

ConnectionPool::FreeConnection(c);

画外音:取出连接、发送请求、放回连接,也非常清晰。

连接池核心原理与实现是怎么样的呢?

可以看到连接池ConnectionPool主要有三个核心接口:

(1)Init:初始化Array[DBClientConnection],这个接口只在服务启动时调用一次;

(2)GetConnection:请求每次需要访问数据库时,不connect一个新连接,而是通过连接池的这个接口来拿连接;

(3)FreeConnection:请求每次访问完数据库时,不是close一个连接,而是把这个连接放回连接池;

 

连接池核心数据结构是怎样的呢?

连接池至少包含两个核心数据结构:

(1)连接数组Array DBClientConnection[N];

(2)互斥锁数组Array lock[N];

 

连接池核心接口,是如何通过核心数据结构的操纵,实现连接池功能的呢?

Init(){

for i = 1 to N {

Array DBClientConnection [i] = new();

Array DBClientConnection [i]->connect();

Array lock[i] = 0;

}

}

画外音:把所有连接和互斥锁初始化。

 

GetConnection()

for i = 1 to N {

if(Array lock[i] == 0){

Array lock[i] = 1;

return Array DBClientConnection[i];

}

}

}

画外音:找一个可用的连接,锁住,并返回连接。

 

FreeConnection(c)

for i = 1 to N {

if(Array DBClientConnection [i] == c){

Array lock[i] = 0;

}

}

}

画外音:找到连接,把锁释放。

 

「转」连接池居然这么简单?

 

 

会发现,连接池管理核心并没有想象的复杂。

 

除了核心代码,连接池还需要考虑哪些因素呢?

(1)需要实施连接可用性检测,如果有连接失效,需要重建连接;

(2)通过freeArray,connectionMap等数据结构,可以让取出连接放回连接都达到O(1)时间复杂度;

(3)可以通过hash取连接,实现id串行化;

(4)每条连接被取到的概率必须相同,以实现负载均衡;

(5)如果有下游故障,失效连接必须剔除,以实现故障自动转移;

(6)如果有下游新增,需要动态扩充连接池,以实现服务自动发现;

 

思路比结论更重要,希望大家有收获。



Tags:连接池   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
在了解连接池之前,我们需要对长、短链接建立初步认识。我们都知道,网络通信大部分都是基于TCP/IP协议,数据传输之前,双方通过“三次握手”建立连接,当数据传输完成之后,又通过“四次挥手”释放连接,以下是“三次握手”与“四...【详细内容】
2021-12-14  Tags: 连接池  点击:(17)  评论:(0)  加入收藏
Druid是阿里巴巴的一个开源项目,号称为监控而生的数据库连接池,在功能、性能、扩展性方面都超过其他,例如 DBCP、C3P0、BoneCP、Proxool、JBoss、DataSource 等连接池,而且Druid已经在阿里巴巴部署了超过600个应用,通过了...【详细内容】
2021-06-17  Tags: 连接池  点击:(117)  评论:(0)  加入收藏
当数据库服务器和客户端位于不同的主机时,就需要建立网络连接来进行通信。客户端必须使用数据库连接来发送命令和接收应答、数据。通过提供给客户端数据库的驱动指定连接字符...【详细内容】
2020-09-21  Tags: 连接池  点击:(96)  评论:(0)  加入收藏
一、前言基本上来说,大部分项目都需要跟数据库做交互,那么,数据库连接池的大小设置成多大合适呢?一些开发老鸟可能还会告诉你:没关系,尽量设置的大些,比如设置成 200,这样数据库性能...【详细内容】
2020-09-16  Tags: 连接池  点击:(98)  评论:(0)  加入收藏
本文作者 Xargin,个人博客:https://xargin.com/。http 标准库服务端请求处理package mainimport ( "io" "log" "net/http")func sayhello(wr http.ResponseWriter, r *http.Re...【详细内容】
2020-07-19  Tags: 连接池  点击:(46)  评论:(0)  加入收藏
一、前言为何要用http连接池那?因为使用它我们可以得到以下好处:因为使用它可以有效降低延迟和系统开销。如果不采用连接池,每当我们发起http请求时,都需要重新发起Tcp三次握手...【详细内容】
2020-06-13  Tags: 连接池  点击:(83)  评论:(0)  加入收藏
什么是连接池?顾名思义,连接池就是一堆预先创建好的连接,跟容器会有点像。连接池主要是在某种需要网络连接的服务,提前把连接建立好存起来,然后存放在一个池子里面,需要用到的时候...【详细内容】
2020-05-29  Tags: 连接池  点击:(77)  评论:(0)  加入收藏
每次新项目的时候,都要从头去找一遍数据库工具类。这里分享一个简单实用的C#的通用DbHelper工具类,支持数据连接池。 连接池配置<connectionStrings>  <add name="dh_web" c...【详细内容】
2020-04-18  Tags: 连接池  点击:(67)  评论:(0)  加入收藏
来源 | 犀牛饲养员的技术笔记封图| CSDN 下载于视觉中国 背景介绍数据库连接池和线程池等池技术存在的意义都是为了解决资源的重复利用问题。在计算机里,创建一个新的资源...【详细内容】
2020-03-22  Tags: 连接池  点击:(78)  评论:(0)  加入收藏
什么是数据库连接池:连接池是一种常用的技术,为什么需要连接池呢?这个需要从TCP说起。假如我们的服务器跟数据库没有部署在同一台机器,那么,服务器每次查询数据库都要先建立连接,...【详细内容】
2020-03-04  Tags: 连接池  点击:(81)  评论:(0)  加入收藏
▌简易百科推荐
本文分为三个等级自顶向下地分析了glibc中内存分配与回收的过程。本文不过度关注细节,因此只是分别从arena层次、bin层次、chunk层次进行图解,而不涉及有关指针的具体操作。前...【详细内容】
2021-12-28  linux技术栈    Tags:glibc   点击:(3)  评论:(0)  加入收藏
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(2)  评论:(0)  加入收藏
程序是如何被执行的&emsp;&emsp;程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(10)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(20)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(25)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(25)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条