美文网首页Java架构师圈子
连接池原来这么简单(一分钟系列)

连接池原来这么简单(一分钟系列)

作者: 灰色程序 | 来源:发表于2017-06-17 16:08 被阅读72次

一、如何通过连接访问下游
工程架构中有很多访问下游的需求,下游包括但不限于服务/数据库/缓存,其通讯步骤是为:
(1)与下游建立一个连接
(2)通过这个连接,收发请求
(3)交互结束,关闭连接,释放资源

这个连接是什么呢,通过连接怎么调用下游接口?服务/数据库/缓存,官方会提供不同语言的Driver、Document、DemoCode来教使用方建立连接与调用接口,以MongoDB的C++官方Driver API为例(伪代码):
DBClientConnection* c = new DBClientConnection();
c->connect(“127.0.0.1:8888”);
c->insert(“db.s”, BSON(”shenjian”));
c->close();

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

二、为什么需要连接池
当并发量很低的时候,上述伪代码没有任何问题,但当服务单机QPS达到几百、几千的时候,建立连接connect和销毁连接close就会成为瓶颈,此时该如何优化?

结论也很简单,服务启动的时候,先建立好若干连接Array[DBClientConnection],当有请求过来的时候,从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)需要实施连接可用性检测
(3)为了让调用方更友好,可能还需要包装一层DAO层,让“连接”这个东西对调用方都是黑盒的
(4)通过freeArray,connectionMap可以让取连接和放回连接都达到O(1)时间复杂度
(5)可以通过hash实现id串行化
(6)负载均衡、故障转移、服务自动扩容都可以在这一层实现

希望这一分钟大家有收获。
==【完】==
大家可以点击加入群:283943715java高级交流群**里面有Java高级大牛直播讲解知识点 走的就是高端路线(如果你想跳槽换工作 但是技术又不够 或者工作上遇到了瓶颈 我这里有一个JAVA的免费直播课程 讲的是高端的知识点基础不好的误入哟 只要你有1-5年的开发经验可以加群找我要课堂链接 注意:是免费的 没有开发经验误入哦)

相关文章

  • 连接池原来这么简单(一分钟系列)

    一、如何通过连接访问下游工程架构中有很多访问下游的需求,下游包括但不限于服务/数据库/缓存,其通讯步骤是为:(1)...

  • 原来这么简单

    本文参加简书七大主题正文S2和故事 天空无云,晴朗正好。 我永远忘不了那一天,当我坐在气氛严肃紧张的中...

  • 原来这么简单

    眼前赫然立着那棵圣诞树,微红的手心仍在隐隐作痛,回眸望入他那明澈的目光,我已了然。喔,原来这么简单。 ...

  • 原来这么简单

    抛开一切思想杂念 摒弃诸多繁文缛节 不去计较得失与成败 不去揣测别人的行为动机 就做自己喜欢又想做的事情 —— 坐...

  • 原来这么简单

    回来了啊 这两天干什么去了 追了个女生 多大 十八 我去 怎么样 搞定 擦嘞 这么容易? 200 ……

  • 原来这么简单

    今天,在电脑上登录简书写文章,打字明显快多了。写什么呢?今天没做什么“正事”,一直在“打酱油”,哈哈。眼看要下班了...

  • 原来这么简单

    文/广州一考生 原以为两点一线的生活埋没了我的情感;原以为分数至上的世界里,让我的心变得木然;原以为每天泡...

  • 原来这么简单

    做作业。对于我这个脑速很快的小孩不是什么问题,但是不知道什么时候开始,我的作业很难按时完成了。因为作业没能按...

  • 原来这么简单

    文/广州一考生 原以为两点一线的生活埋没了我的情感;原以为分数至上的世界里,让我的心变得木然...

  • 原来这么简单

    世间万物,色彩斑斓,包罗万象。每当遇到新的事物、新的问题一开始时就会感觉很困难,但是认真的去学、去做就会发现...

网友评论

    本文标题:连接池原来这么简单(一分钟系列)

    本文链接:https://www.haomeiwen.com/subject/rrqbqxtx.html