服务连接池,数据库连接池,缓存连接池,连接池是微服务分层架构中不可或缺的一个组件,本篇讲讲连接池的原理,以及实现细节。
10年积累的成都网站制作、成都网站设计经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有温县免费网站建设让你可以放心的选择与我们合作。
工程架构中有很多访问下游的需求,下游包括但不限于服务/数据库/缓存,其通讯步骤是为:
不管是服务/数据库/缓存,官方会提供不同语言的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就会成为瓶颈,此时该如何优化呢?
从而避免反复的建立和销毁连接,以提升性能。
而这个对Array[DBClientConnection]进行维护的数据结构,就是连接池。
有了连接池之后,数据库操作的伪代码变为:
DBClientConnection* c =
ConnectionPool::GetConnection();
c->insert(“db.s”, BSON(”shenjian”));
ConnectionPool::FreeConnection(c);
画外音:取出连接、发送请求、放回连接,也非常清晰。
可以看到连接池ConnectionPool主要有三个核心接口:
连接池至少包含两个核心数据结构:
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;
}
}
}
画外音:找到连接,把锁释放。
会发现,连接池管理核心并没有想象的复杂。
思路比结论更重要,希望大家有收获。
网站标题:连接池居然这么简单?
分享路径:http://www.shufengxianlan.com/qtweb/news26/177026.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联