博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
连接池的实现
阅读量:5949 次
发布时间:2019-06-19

本文共 1218 字,大约阅读时间需要 4 分钟。

1. 背景

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

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

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

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

2. 为什么需要连接池?

当并发量很低的时候,建立连接和关闭连接的过程是没问题的,但当服务单机QPS达到几百、几千的时候,建立连接和销毁连接就会成为瓶颈,此时如何优化?

结论很简单,服务启动的时候,先建立好若干连接Array[Connection],但有请求过来的时候,从Array中取出一个,执行下游操作,执行完再放回,从而避免反复的建立和销毁连接,以提升性能。

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

3. 连接池核心接口和实现

通过上面的讨论,可以看到连接池ConnectionPool主要有三个核心接口

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

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

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

连接池核心数据结构

(1)连接数据Array[Connection]

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

连接池核心接口实现:

Init() { for i = 1 to N {  Array Connection [i] = new();  Array Connection [i]->connect();  Array lock[i] = 0; }}说明:把所有连接和互斥锁初始化GetConnection() for i = 1 to N {  if(Array lock[i] == 0) {   Array lock[i] = 1;   return Array Connection[i];   } }}说明:找一个可用的连接,锁住,并返回连接FreeConnection(c) for i = 1 to N { if(Array Connection [i] == c) {   Array lock[i] = 0;   }  }}说明:找到连接,把锁释放

4. 细节

(1)如果连接全部被占用,是返回失败,还是让上游等待?

(2)需要实施连接可用性检测;

(3)为了让调用方更友好,可能还需要包装一层DAO层,让“连接”对调用方都是黑盒的;

(4)通过freeArray,connectionMap可以让取连接和放回连接都达到O(1)时间复杂度;

(5)可以通过hash实现id串行化;

(6)负载均衡、故障转移、服务自动扩容都可以在这一层实现。

 

转载于:https://www.cnblogs.com/lujiango/p/9650275.html

你可能感兴趣的文章
部署模式 - 每个主机多个服务实例
查看>>
COJS:1829. [Tyvj 1728]普通平衡树
查看>>
SpringBoot 教程之 profile
查看>>
面试题编程题08-python 垃圾回收机制
查看>>
排序--冒泡
查看>>
java中int->String 3种方式效率分析
查看>>
Android 内存管理 &Memory Leak & OOM 分析
查看>>
你所能用到的数据结构(八)
查看>>
(转)谁是真正的程序语言专家
查看>>
T001 A+B(附常见标准输入输出)
查看>>
Java中abstract class和interface的区别
查看>>
SDWebImage 图片下载缓存框架 常用方法及原理
查看>>
MapReduce分布式缓存程序,无法在Windows下的Eclipse中执行问题解决
查看>>
[转]html5 Canvas画图教程(7)—canvas里画曲线之quadraticCurveTo方法
查看>>
[水]三个数学的小技巧题
查看>>
mysql中查看数据库的版本,什么版本
查看>>
[leetcode-342-Power of Four]
查看>>
MongoDB3.0 创建用户
查看>>
2017-2018-1 20155319 《信息安全系统设计基础》第3周学习总结
查看>>
express 3.0.x 中默认不支持flash() 的解决方法
查看>>