[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. 负载均衡、故障转移、服务自动扩容都可以在这一层实现