客户端机器配置有点低了,256M内存, 数据库服务器配置和现在主流PC配置差不多.客户端数量较多,200个左右,属于四个不同的应用程序,共同使用一个数据库.(实际客户端PC在100台左台,其中,绝大部分PC上都会安装两个应用程序).数据量也有点大,每天每个客户端会产生约一百条记录(向主要的业务表里写记录).写的时间比较集中,都集中分布在4,5个小时内.每天会向两三个主表里写入一万多条的记录..(要求保留两三个月内的业务数据). 几个主要的业务表里,数据量可能会达到六七十万条..
80%的客户端的主要任务是写记录..另外有五六个客户端,主要负责查询及更新记录.(读取数据,立即打印(打印有点慢),立即更新记录)
现在最担心的问题是:
程序采用的是两层结构,所有客户端都直接与数据库相连, 那么多的客户端,以及那么大的数据库,SQL数据库能否带得动?是否会造成很严重的延时或是其它的错误?另外,程序基本写完了,可是该如何测试性能呢? 如何模拟客户端的并发问题? (比如两个客户端同时向数据库里写记录,写记录之前,它们需要先获得唯一编号,如何确保它们获得的编号唯一,不重复?)还有一些其它的问题,暂时没有想到,恳请各位指点!!!!!

解决方案 »

  1.   

    主要测以下几点:
    1.并发能力(指客户端并行访问能力,多少个连接数时MSSQL的性能是多少,CPU占用多少,内存占用多少,对其它连接是否会造成影响)
    2.悲观锁测试。
    因为MSSQL默认上的都是悲观锁,加之你在业务内有一些更新操作,这样在数据量大且多个事务并行处理时由于某事务在更新时持着排它锁,会造成其它事务发生阻塞或死锁。
    3.乐观锁测试。
    在二个客户端同时把数据下载到本地修改,后提交的数据会把前提交的数据覆盖,测试一下是否会出现该问题
    4.编号是否唯一?
    这要看你是如何处理编号的,最根本也是最经典的办法是每次获取某表新编号时要对该表加上排它锁,这样在申请编号时就并变串了,通俗的做法就是用一张最大值表来处理。每次更新表内某表的最大值时,加上排它锁。这里要注意:如果100个连接同时申请编号时,肯定要都访问最大值表,这样在申请时最好加上READPAST来跳过已锁定记录,否则会出现多个请求均在等待该锁,最终将最大值表锁住。我想到的就这么多,可能思路有点乱,乱说一通,觉得有意义就采纳
      

  2.   

    有时候想想,MSSQL在多事务(INSERT、DELETE、UPDATE)时为啥要把整个表都锁掉呢?
    当然,有READPAST来跳过锁定记录,这不是增加程序员的工作量嘛!
      

  3.   

    to: liangpei2008   谢谢你的回复!!! 仍有几个问题想向你请教.1: 并发测试:
      之前还在考虑怎样来做并发测试, 我这样来模拟并发测试是否行?
      在测试程序里,创建多个(如200-500个)TAdoquery, 让他们同时对一张表进行查询,写入,等操作(是否需要用到多线程?). 然后查看CPU,内存,以及数据库的性能怎么样.
      那么,就想问你一个问题了,在上面的测试中(只有一个ADOConnection连接到数据库),它是属于一个连接,还是多个连接?(因为它同时有很多个TAdoquery在进行数据处理)..2: 编号唯一问题:
      在我的程序中,采取的编号唯一管理,与你说的方式,基本相同,却没有用到记录锁..
      我用一个表,存储当前的最大编号,那么,这个表里,就只有几条记录了.在用存储过程,来获得编号. 存储过程的语句也很简单,先读取最大编号,然后加一并更新记录,返回新值.
      我也考虑到了并发问题,却没有采用加锁. 采用的是,"事务处理". 在存储过程的第一句, begin tran 最后一句 Commit. 现在看来,这种方式,肯定没有加锁好..
      另外,向朋友也请教过类似的问题,他要求我在数据查询中,如果有Grid的数据显示控件,不要一次显示太多的数据,看来,这也是个不错的建议..