最近做了一个小的server.功能就是把客户端的请求,通过访问数据库,把结果返回去。稳定运行10来个小时就会死。
1、
indy(用了IdSchedulerOfThreadPool)+多线程+数据库
IdSchedulerOfThreadPool的设置MaxThreads = 100,PoolSize = 102、
IdTCPServerConnect的时候,加入了CoInitialize(nil);
IdTCPServerDisconnect的时候加入了CoUnInitialize;
3、
支持并发。并发量最高10左右(因为需要访问数据库,所有并发的数量,跟数据库的放映速度有关)4、
每个单独的线程都有自己单独的数据库连接和操作控件(动态生成的ADOQuery或者ADOStoredProc)
5、
一共用了2个锁。
1、所有用户连接都实例成了一个user对象。放在一个叫做users的threadlist中。这需要一个锁。
2、子线程访问主线程(用来显示当前连接和请求内容的数据),需要一个锁。发现的问题
程序稳定运行的时候,CPU占有量0左右。内存,稳定在20M左右。(稳定运行时间大约10来个小时)
程序死掉的时候(无响应,连接不进去),CPU占有量50%左右,内存依然20左右。
纠结了好久,查了好多地方,不知道为啥会死掉!请有经验的高手指教。

解决方案 »

  1.   

    定期把线程中的对象输出到日志看看。 
    这个问题不看代码不好查。不过我有二个项目也用的 indy 应该有二三百个客户端,响应也一直很好。
      

  2.   

    INDY是基于线程模型的,需要特别注意线程之间的同步,着重检查一下这方面。
      

  3.   

    INDY基于TCP的话,一般1000左右就达到目标了。
      

  4.   

    SQLDebug_Fan 谢谢
    关键程序要运行10来个小时才会挂。所以,这个BUG,普通的测试还测不出来。连接数量并不多,都是短连接,一般不超过20个连接。我想,一定是什么特殊的原因,进入了一个不起眼的特殊状态……
      

  5.   

    建议 每个线程创建的时候给一个名字(比如创建时间)。
    然后在日志里记录下,这个名字收到的SQL,以及返回的RecordCount(或者 FieldCount)。
    然后喝茶去,10个小时后,看一下日志就知道了。
      

  6.   

    TIdAntiFreeze组建用一个看看呢?