首先,如何通过连接访问下游
工程体系结构对下游访问有很多要求,包括但不限于服务/数据库/缓存,通信步骤如下:
(1)建立与下游的连接
(2)通过此连接发送和接收请求
(3)结束交互、关闭连接、释放资源
这个连接是什么,如何通过连接调用下游接口?服务/数据库/缓存、官方提供的驱动程序、Document和DemoCode以MongoDB的c官方驱动程序API(相似代码)为例,教用户如何设置连接和调用接口。
dbclientconnection * c=new dbclientconnection();
c-c-connect(" 127 . 0 . 0 . 1:888 ");
c-insert(“db . s”,bson(“申建”));
c-close();
此DBClientConnection是到MongoDB的连接。官方驱动程序提供了多个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)负载均衡、故障转移、服务自动扩容都可以在这一层实现
大家可以点击加入群:283943715 Java高级交流群里面有Java高级大牛直播讲解知识点 走的就是高端路线(如果你想跳槽换工作 但是技术又不够 或者工作上遇到了瓶颈 我这里有一个JAVA的免费直播课程 讲的是高端的知识点基础不好的误入哟 只要你有1-5年的开发经验可以加群找我要课堂链接 注意:是免费的 没有开发经验误入哦)
1.文章《如何使用数据库连接池,如何查看数据库连接池使用情况…》援引自互联网,为网友投稿收集整理,仅供学习和研究使用,内容仅代表作者本人观点,与本网站无关,侵删请点击页脚联系方式。
2.文章《如何使用数据库连接池,如何查看数据库连接池使用情况…》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
相关推荐
- . 现代买票为什么带上携程保险
- . 潮阳怎么去广州南站
- . 湖南马拉河怎么样
- . 烧纸为什么到三岔路口
- . 百色为什么这么热
- . 神州租车怎么样
- . 芜湖方特哪个适合儿童
- . 护肤品保养液是什么类目
- . 早晚的护肤保养有哪些项目
- . 女孩护肤品怎么保养的最好