公司组织我们小组用完成端口开发Web Server目前内核已经完工,在400M Bytes/小时流量的公司主页上测试运行,比较稳定。而且比IIS节省CPU资源(约占了0.005的cpu)现在要让用户建立自己的个人档案,因此需要用到数据库,也许是SQL Server或者本地的Access数据库我的问题是,数据库访问的代码,是不是要单独开一个线程?
因为数据库的连接/访问需要等待,在等待的这段时间如果用worker thread来处理,完成端口的worker thread就会停滞,效率低下目前我的设想是,采用线程池。需要数据库访问的时候,到线程池去抓一个线程出来。worker thread继续等待下一个queue message。然后在这个线程里面访问数据库。等线程执行完毕以后挂起,回到线程池,同时给完成端口post一个queue message告诉它执行完了。然后worker thread接收到这个message再对这个用户继续进行下一步的处理。目前只是个思路,我们小范围讨论过。不知道这个办法是不是最优化的大家有没有更好的办法?提出来互相参考参考。大家各抒己见吧

解决方案 »

  1.   

    我觉得可以,访问DB的时间太长了,会阻塞worer thread的,不过不要用WINDOW的THREAD POOL(QueueUserWorkItem),好象会丢数据(不知是不是和WOKER THREAD用的完成端口冲突了)。
      

  2.   

    嗯,thread pool方面的代码我们打算自己写
      

  3.   

    总的思路是对了. 关键要协调好数据库访问的模块与IOCP SERVICE之间的问题. 数据库访问的模块应该用一个叫数据库访问的模块管理器来管理. public 出来:
     
    API:
     AddDB Job ( ... )Events: 
     Finish DB Job ( ... ) 
     DB Job Err ( ... )
     
     Other DB Err... ()
    管理器 内部不一定一定要用多线程来解决. 只求稳定就行. 速度不是最重要的.因为对数据库
    的访问本身就很慢.  当然在性能上,如果有特别的要求. 也是可以用多线程的.我也在做这些东东. *_* +U
      

  4.   

    具体到实际的细节我想这样做:由于Web Server访问量会很大,数据库操作一定会同时并发多个
    但是数据库操作又会有很多不同的具体动作。
    因此打算在一个类中定义不同的处理函数。比如目前想分成登陆/注册/保存用户信息这3个函数。当然以后会增加其他更多的函数线程池中抓到线程以后,给这个线程一个DWORD数据,告诉它应该做什么。线程执行的时候判断这个DWORD去执行相应的函数。
    这个时候Worker Thread的循环就什么都不做,continue,继续GetQueuedCompletionStatus当数据库线程执行完毕的时候,就用PostQueuedCompletionStatus告诉完成端口的worker thread自己执行完了,让它继续进行网络操作。
      

  5.   

    提供我以前的一个经验,用的是IIS+SQL Server,我们当时写的一个程序在访问数据库的时候出现了一个阻塞的情况(无法连接到数据库),结果导致IIS的进程占用CPU资源达到100%,服务器基本上处于无响应的状态,所以你们现在的考虑的情况(访问数据库阻塞了WebServer的处理)是会出现的。
      

  6.   

    to quengzi(code) :没看懂你的意思能不能详细描述一下先?完成端口是多线程没错,但是它得线程数根据CPU数量来的。目前我们2CPU只用了4个worker thread但是理论上我们觉得连接sql server的动作会阻塞,因此当2个或者更多的数据库操作并行的状况下,就会阻塞完成端口的worker thread,造成系统效率低下之所以有顾虑,是根据系统效率来考虑的。