浅谈SQL Server数据库并发测试方法


  本文标签:SQL Server 并发 测试

  1. 利用测试工具模拟多个最终用户进行并发测试;

  这种测试方法的缺点:最终用户往往并不是直接连接到数据库上,而是要经过一个和多个中间服务程序,所以并不能保证访问数据库时还是并发  。其次,这种测试方法需要等到客户端程序、服务端程序全部完成才能进行;

  2. 利用测试工具编写脚本,直接连接数据库进行并发测试;

  这种方法可以有效的保证并发操作,而且在数据库访问程序完成即可测试,可以大大缩短测试时间,而且测试效果更好  。

  下面通过一个演示程序,演示使用Robot使用第二种测试方法进行数据库的并发测试  。

  第一步:创建演示程序

  打开SQL SERVER查询分析器,在SQL SERVER测试数据库中执行下列脚本(脚本执行操作:创建表testtable,并插入一条记录;创建存储过程test): 

  

if exists (select * from dbo.sysobjects where id = object_id(N[dbo].[Test]) and OBJECTPROPERTY(id, NIsProcedure) = 1)

  

  drop procedure [dbo].[Test]

  GO

  if exists (select * from dbo.sysobjects where id = object_id(N[dbo].[testtable]) and OBJECTPROPERTY(id, NIsUserTable) = 1)

  drop table [dbo].[testtable]

  GO

  CREATE TABLE [dbo].[testtable] (

  [testid] [int] NULL ,

  [counts] [int] NULL

  ) ON [PRIMARY]

  GO

  insert into testtable (testid,counts) values (1,0)

  GO

  SET QUOTED_IDENTIFIER ON

  GO

  SET ANSI_NULLS ON

  GO

  CREATE Procedure dbo.Test

  as

  declare @count int

  begin tran TEST

  select @count=countsfrom testtable where testid=1

  update testtable setcounts=@count+1

  if (@@error >0) begin

  rollback tran TEST

  end else begin

  commit tran TEST

  end

  GO

  SET QUOTED_IDENTIFIER OFF

  GO

  SET ANSI_NULLS ON

  GO

  

  第二步:创建测试脚本

  在Robot中新建VU脚本,输入以下内容:

  
 #include 

  

  {

  push Timeout_scale = 200; /* Set timeouts to 200% of maximum response time */

  push Think_def = "LR";

  Min_tmout = 120000; /* Set minimum Timeout_val to 2 minutes*/

  push Timeout_val = Min_tmout;

  ser=sqlconnect("server","sa","888","192.168.0.99","sqlserver");

  set Server_connection = ser;

  push Think_avg = 0;

  sync_point "logon";

  sqlexec ["sql_1000"] "testdb..test";

  sqldisconnect (ser);

  }

  说明:

  
ser=sqlconnect("server","sa","888","192.168.0.99","sqlserver")

  sa为数据库用户名,888为sa密码,192.168.0.99数据库IP地址

  以上三项按实际的测试数据库设置更改,其他两项不用修改

  
sqlexec ["sql_1000"] "testdb..test"

  testdb为新建存储过程test所在的数据库,按实际的数据库修改

  第三步:执行测试

  运行上一步创建的脚本(运行时自动创建Suite),在Run Suite窗口中的"Number of users"上输入20  。运行完脚本,打开数据库查看counts的数值  。把counts值改为零多次运行脚本,观察每次运行后counts的结果  。

  测试说明:

  1. 测试示例程序的目的是,存储过程test每执行一次,表testtable中的counts字段增加一;

  2. 第三步的测试可以发现每次执行后counts结果并不相同,而且不等于20,这说明这个程序是在并发时是问题的;

  3. 将存储过程中的select @count=countsfrom testtable where testid=1修改为select @count=countsfrom testtable with (UPDLOCK) where testid=1  。再次进行并发测试,每次的结果应该都是20  。

  以上演示程序,仅仅演示了测试的方法  。在实际的数据库并发测试中,首先要确定存在哪些并发情况、哪些数据受到并发影响,然后编写脚本,设置suite进行并发测试  。