目前做一个联网的IC卡售电系统,大体设计思想是这样的:整个系统分为3个层次处理,分别是数据库服务器,中间层处理服务器,客户端。数据库采用的是oracle9i,中间层用的是windows下的socket通信。中间层一直开启监听服务,当收
到客户端的相关请求后(比如买电),启动一个线程,向数据库服务器进行相关查询,然后将查询结果回送给客户端,中间层线程结束,客户端将下传的数据进行写卡操作。这种处理模式合理吗?我目前用公司内部几台客户机同时操作基本正常,但随着网点客户端的增多,会出现什么问题吗? 希望大家一起讨论下。

解决方案 »

  1.   

    祺邮Bussiness Mail(BMail) 1.0 | 邮件管理/公司架构管理
    http://www.bmailqy.com
      

  2.   

    我想到的问题是,这种模式最多同时不能超过2028个客户.先不算你程序本身启动时用的线程,一个进程在默认堆栈的情况下,最多只能创建2028个线程.既然你每个客户都要至少创建一个线程,那么2028个客户是程序最大上限能处理的客户数.(查找MSDN关于CreateThread()的API有关于一个进程最大可创建线程数相关资料)
      

  3.   

    不建议socket服务器直接读写数据库,
    socket服务器只管数据收发,读写数据库应该另做一个程序。
      

  4.   

    完成端口非必要性,但是使用线程池是非常必要的,一个应用程序同时能够运行的线程数是有限的,并且真正并行的线程更是依赖于CPU的核心数量,因此当1000个请求上来时,如果你同时开启了1000个线程,真正能够同时处理的线程数量也是很小的,剩下的线程除了无尽等待也不会做任何事情,并且每个线程都有一个栈内存的分配,这是对系统资源的非必要占用,而那些处于长时间等待之后的线程,在得到CPU时间的时候恢复运行也是需要一定时间的,即线程的切换时间,加之如此众多的线程之间切换对操作系统也是一个相当大的非必要的消耗.既然同一时间能够执行的任务是有限的,那么为什么不把这些任务排个队,让有限的线程处理完一批再从队列当中提取下一批进行处理呢?所以说线程池是非常必要的.
      

  5.   


    谢谢你的回复!
    socket只对客户端收发数据,对数据库的操作是由pro c完成的.