现在项目在开发阶段,web操作和数据库在两台机器上,web上的数据通过socket发送到数据库主机上,数据库主机用一个
已经连接了的数据库句柄操作SQL语句。现在只是在开发阶段,没有性能方面的考虑,但是一旦web开得太多、频繁操作,
而且对每条消息的处理数据量是比较大的,后面的很多web消息都滞后了,web的反应很慢,甚至超时。现在要增加两个措施:一个是实现线程池,为每条消息取出一个线程的资源执行操作;
    一个是实现数据库连接池,每次调用线程池的一个线程,从连接池取出一个资源作为线程的参数,
                         避免多个线程竞争一个数据库句柄而操作失败。
补充:系统启动时,数据库主机自动连接数据库产生一个句柄,所有的SQL操作都使用同一个句柄。
      现在比较急的是解决连接池问题,暂时为每条web消息临时生成一个线程,再从连接池取一个空闲资源执行SQL操作。现有的模板一小部分如下:
LRESULT CALLBACK IntfWndEvCallBack(IN HWND hWnd,IN SkUInt32 uMsg, IN WPARAM  wParam,IN LPARAM lParam)
{    switch(WSAGETSELECTEVENT(lParam))
    {
.....        case FD_READ:
            EvHandleReadEvent(wParam);
            break;
     .....        default:
            break;
    }
}
    该回调函数负责处理web消息,当判断为FD_READ消息时,实现从连接池中取空闲资源作为EvHandleReadEvent()的参数执行SQL操作。我现在用的是C语言开发,之前从未用过连接池,请各位大虾在上面的模板里帮我简单地实现,只求形成模板,我好套用就行了。请不吝指教!!! 工作需要,非诚勿扰!!!

解决方案 »

  1.   

    简单地,当你用keepalive时,用的是apache线程池;
    当你用 数据库用持续连接时,用的是数据库连接池;
      

  2.   

    补充:web和数据库之间是有经过其他模块处理的,假设是BT,分布在不同的机器上,数据库的主机可以看作是
    第三方。  web --> BT --> 数据库
    假设有多个BT连接到一台数据库机器上,数据库接受连接后得到一个描述符sockfd,然后对其设置监听WSAAsyncSelect(sockfd, ‘某个窗口句柄’, ‘某个标识’, FD_READ|FD_CLOSE|FD_WRITE );这样一旦有数据来,就可以通过窗口函数得到特定的sockfd,然后再使用sockfd进行recv( ......)
    到这里为止,就要开始使用连接池处理那些接受到的SQL操作了。我现在甚至不知道用C能不能实现数据库连接池,好像网上的说法是要用类实现。哪位高手好心指点指点吧,万分感激呀 !!!