有两个问题, 
1.这个比较基础,想了解一下PutCommandTimeout设置超时时间后,如果有一个命令执行时间超时了会执行什么样的操作,也就是我如何知道超时的命令,能在超时后设置回调函数处理吗?如果能,请教该怎么做. 2.项目中比较头疼的问题,目前还不能完全确定是SQL的访问问题,但根据出事情况大致能断定是数据库访问的问题,具体问题如下: 
  某用户登录时读取用户信息(可能会有很多用户同时登录),该函数头和函数尾都用GetTickCount函数来获取时间相减得到函数执行时间,其间包括比较多的一些用户信息数据库读取操作,API是用的msado15,但每天都会有用户反映说登录时间超过几分钟,而且根据函数执行的时间Log记录中看到确实有这样超长时间记录,原因不明,但该用户等待几分钟后确实成功登陆了,代码中没有发现主线程中有造成阻塞的代码,所以只能断定是数据库访问的问题,但是其它的服务器在同一时间访问同一数据库貌似又没有什么问题,很诡异,我不太了解msado底层的处理方式,我觉得同一个数据库多个连接访问,最终应该是队列的方式单线程处理这些访问消息... 
  希望大虾们能给一些有帮助的建议去尝试查出原因并解决。在线等

解决方案 »

  1.   

    1.这个比较基础,想了解一下PutCommandTimeout设置超时时间后,如果有一个命令执行时间超时了会执行什么样的操作,也就是我如何知道超时的命令,能在超时后设置回调函数处理吗?如果能,请教该怎么做. 如果设置了这个属性,到达指定超时时间,查询依然未能完成,则会在这个时间抛出异常,你可以通过异常捕获来决定做什么。2.根据你的情况,你的用户表比较大,如果这个表更新的不算频繁,只是select频繁,那么就是加索引。
    如果用户表比较大,但是登陆的同时,还伴随其他用户大量的update,delete。insert操作,即使有索引,很有可能会产生频繁的重建索引的调用(表重建索引),重建索引会导致频繁锁表,现象就是select都有可能被锁定。解决办法么,就是不要索引。但是这又出现矛盾。用户登陆验证的表,最好拆分。对于验证字段,单独建表,其他经常更新的字段,放在另外一个表中。这样只用主键表来验证。就能好一些