有关连接池管理的一个简单实现设想
这几天在做一个API的时候,由于后端服务器量太多,导致前段webserver的CGI连接数过多,所以,不得不使用连接池来进行管理。(好吧,我知道说出来有点恐怖,600台webserver,125台32G的cache服务器,也就是cache量接近3T……)
之前有人实现过,大体思路如下:
1)定义一个list数组,里面的每个指针对象维护一条连接,并且为list规定一个最大值。
2)每当有信莲连接生成时(或者已经有的连接重新使用),就向list中添加一个对象;如果list的大小已经大于最大值,那么就把最后一个对象关闭并且扔出连接池(也就是要求,在这个对象的连接被断掉后,这个对象再次使用时,应该有重连的功能)
这样做的确比较简单,但是也会产生如下几个问题:
1)在第二点中,如果是已经有的连接重新使用,假设我们规定list的最大大小为1,那么这个被重复使用的连接实际上是在被重复的关闭和重新打开。
2)没有权重的概念,即可能对于一个访问频率比较高的连接,很可能会被一个访问量比较低的连接冲击导致连接断掉。
基于以上考虑,我重新设计了一套连接池模型:
typedef _conn_info
{
int iCreateTime;//就是创建这个结构体的时间(第一次建立连接时的时间)
int iLastTime;//最后一次被调用的时间
int iReq;//被使用到的次数
CConnClass* ptrConn;//对象的指针,维护着一个长连接
//需要重载 >,>=,==,<,<= 几个符号,因为需要直接来通过struct的比较来实现权重的比较
}ConnInfo;
class CConnPool
{
public:
int SetMaxConnNum(int maxConnNum);
int push_back(CConnClass *ptrConn)
{
m_MulSetConnInfo.find(ptrConn)
if(找到ptrConn在m_MulSetConnInfo中已经存在)
{
获取已经存在的ConnInfo;
从m_MulSetConnInfo中删除
}
else
{
创建一个新的ConnInfo
}
将iLastTime和iReq重新赋值,并且塞回m_MulSetConnInfo中去;
while(m_MulSetConnInfo.size()>m_MaxConnNum)
{
获取m_MulSetConnInfo的最后一个对象
关闭这个对象的ptr维护的长连接
m_MulSetConnInfo.erase(这个对象);
}
}
private:
multiset<ConnInfo> m_MulSetConnInfo;//用来
int m_MaxConnNum;
};
用这样的方法来实现的最大好处,就是,权重小(包括调用量小等等)的长连接基本不会影响到权重大的长连接,当然,这样消耗的效率也会比直接用list大一点。
好啦,就到这里啦,如果有更好的实现方法,我会继续在这里和大家分享的~
建议继续学习:
- Hibernate连接池配置实例 (阅读:1931)
- Java数据库连接池小结 (阅读:1947)
- 常驻连接池(Database Resident Connection Pool) (阅读:1863)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:Dante 来源: Vimer
- 标签: 连接池
- 发布时间:2010-01-18 12:12:40
- [55] IOS安全–浅谈关于IOS加固的几种方法
- [54] 图书馆的世界纪录
- [54] 如何拿下简短的域名
- [54] android 开发入门
- [52] Oracle MTS模式下 进程地址与会话信
- [52] Go Reflect 性能
- [49] 【社会化设计】自我(self)部分――欢迎区
- [48] 读书笔记-壹百度:百度十年千倍的29条法则
- [41] 程序员技术练级攻略
- [35] 视觉调整-设计师 vs. 逻辑