+ -
当前位置:首页 → 问答吧 → 连续查询时时间不定期突发交易超时现象

连续查询时时间不定期突发交易超时现象

时间:2011-11-28

来源:互联网

最近遇到个很奇怪的问题,就是数据库在并发交易时,正常交易(30ms左右)中不时会有几百毫秒的交易
这造成了一些需要执行效率的功能在并发的时候出现问题
所以设计了个小工具在实际工作的数据环境下复现这个问题,希望能找到原因

工具实际运行测试出现的问题如下图所示:


根据上图显示,几千个正常交易中,出现了一个几百毫秒的交易,本人查了N多资料,没有解释该问题的思路,望感兴趣的能给解释一下

下面将测试工具的设计发布一下,希望大家能一起研究指点一下

测试环境,
数据库:SQLSERVER2005
表记录数:211万条记录
查询语句: Select * from tTable where ID between @A and @B --@A to @B间的幅度为2000,ID是主键索引,经测试平均效率为30ms左右

以上是对数据库的操作,下面是测试工具的实现

编程语言:C#.NET2005
1.通过Timer开启线程,Timer实例化的数量由界面上输入的数字参数[启动Timer数]控制
2.编写一个类 GetTrickDoWorker,构造函数中启动一个BackGroundWorker线程执行查询语句,返回的执行时间编号后显示在界面上,查询语句运行在事务中,查询语句中的@A和@B通过Timer的编号确定
3.Timer的Interview属性设为1000ms,即每隔1秒触发一次Tick事件
4.每个Timer的Tick事件中实例化一个GetTrickDoWorker类,实现执行查询和显示执行时间
5.设置一个全局静态的List<Timer>,每个线程在执行查询前将开启线程的Timer加入List,在执行查询完成后将Timer从List中移除。
6.[运行容忍链接数]:为控制并发的交易数量,在界面设置一个数字参数,每个线程在将Timer加入List前读取这个数字,如果List中的Timer大于或等于该参数时,则等待其它线程执行完毕移除Timer后,再继续执行5中的操作。
7.[线程超时时间]:在界面设置一个可以容忍的超时时间数字,单位为毫秒(ms),如果查询效率高于该时间,则调用Timer.Stop()关闭开启这个查询线程的Timer
8.[停止运行参数]:设置一个数字参数,如果实际在运行的Timer数量小于该数字,则关闭所有Timer停止测试并显示测试的总时间,以便观察总时间内出现了几个超时交易

如需要源码请联系我Q359662429

作者: lichjx   发布时间: 2011-11-28

共同研究。

作者: fredrickhu   发布时间: 2011-11-28

压力测试?

作者: qianjin036a   发布时间: 2011-11-28

晕,图片没传上来,嗯,算是并发压力吧,补一张顶楼的图片

作者: lichjx   发布时间: 2011-11-28

SQL code
 Select * from tTable with(nolock) where ID between @A and @B

作者: huleeyar   发布时间: 2011-11-28