档案日期2010的2

2010年1月11日 - 2010年1月17日

最后更新于 .

这几天在做一个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;//对象的指针,维护着一个长连接 ...

最后更新于 .

众所周知,大名鼎鼎的STL使用大量的模板,但是有时候我们也会面临一些需求,比如map或者vector里的数据类型被定义成模板,但这个时候,用起来就会出现问题。
我们先来看一个没有问题的例子:

/*===========================================================
#  Author:          DanteZhu - https://www.vimer.cn
#  Email:           dantezhu@vip.qq.com
#  FileName:        tem.cpp
#  Version:         1.0
#  LastChange:      2010-01-12 10:20:07
#  Description:     
#  History:         
===========================================================*/
#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
typedef struct _CTT
{
    int len ;
}CTT;
template <typename T>
class CParse
{
    public:
        static ...

最后更新于 .

这几天在写一个项目,其中有用到打包和解包的网络通信,相信有过网络编程经验的朋友应该都知道,无非就是 将一个结构体打包成一段buff,以及反向的过程。(这里我们不考虑直接memcpy的情况,因为结构体里的字段有可能只是指针,当然如果都是定长数据的话,那么memcpy当然是最快的) 而在这个过程中,很多代码只是改了很少一部分,但是却要分别写两个函数,严重浪费了人力,而且容易出错。现在让我们看一下,能否用vim来替我们自动完成这件枯燥的事情。 我们来看这样一段示例代码:

int Output( unsigned int ver, char* & buf, int & iLen, int iMaxLen )
{
    int needLen = sizeof(char) * 3 + sizeof(short) + sizeof(int);
    if( needLen > iMaxLen )
    {         
        return FBErrSystemNoMem;
    }     
    char *t_Buff = buff;
    *(unsigned char *) t_Buff = placeId;
    t_Buff += sizeof ...

每日归档

上周

2010年度第 1 周

下周

2010年度第 3 周

归档