连接池实现
最后更新于:2022-04-02 04:13:08
[TOC]
## 连接池核心接口与实现
连接池ConnectionPool主要有三个核心接口:
1. Init:初始化好Array[DBClientConnection],这个接口只在服务启动时调用一次
2. GetConnection:请求每次需要访问数据库时,不是connect一个连接,而是通过连接池的这个接口来拿
3. FreeConnection:请求每次访问完数据库时,不是close一个连接,而是把这个连接放回连接池
连接池核心数据结构:
1. 连接数组Array DBClientConnection [N]
2. 互斥锁数组Array lock[N]
## init()
```
Init(){
for i = 1 to N {
Array DBClientConnection [i] = new();
Array DBClientConnection [i]->connect();
Array lock[i] = 0;
}
}
```
> 把所有连接和互斥锁初始化,0表示没锁,1表示锁
### GetConnection()
```
GetConnection(){
for i = 1 to N {
if(Array lock[i] == 0){
Array lock[i] = 1;
return Array DBClientConnection[i];
}
}
}
```
> 找一个可用的连接(状态为 0),锁住,并返回连接
### FreeConnection(c)
```
FreeConnection(c)
for i = 1 to N {
if(Array DBClientConnection [i] == c){
Array lock[i] = 0;
}
}
}
```
> 找到连接,把锁释放
## 其他问题
1. 如果连接全部被占用,是返回失败,还是让上游等待
2. 需要实施连接可用性检测
3. 为了让调用方更友好,可能还需要包装一层DAO层,让“连接”这个东西对调用方都是黑盒的
3. 通过freeArray,connectionMap可以让取连接和放回连接都达到O(1)时间复杂度
3. 可以通过hash实现id串行化
3. 负载均衡、故障转移、服务自动扩容都可以在这一层实现
';