高并发测试下的一些问题及解决

高并发测试下的一些问题及解决,第1张

概述高并 发测试下的一些问题及解决 测试在sqlserver2000上进行,对工作流 *** 作的相关方法在单元测试里进行多线程并发。测试发现sqlserver出现死锁的情况相当多,一些典 型的情况: 1、对同一张表先insert再update是很快会引起死锁的,不管 *** 作的是否是同一记录 解决方法:对于同一记录,需要调整hibernate的映射策略,使得一次insert完成 *** 作。对于不同的记录需要在代码中手动 高并 发测试下的一些问题及解决

测试在sqlserver2000上进行,对工作流 *** 作的相关方法在单元测试里进行多线程并发。测试发现sqlserver出现死锁的情况相当多,一些典 型的情况:

1、对同一张表先insert再update是很快会引起死锁的,不管 *** 作的是否是同一记录
解决方法:对于同一记录,需要调整hibernate的映射策略,使得一次insert完成 *** 作。对于不同的记录需要在代码中手动flush,使得 update先于insert。

2、对两张表进行多次update *** 作时,两张表交替update也会很快引起死锁
解决方法:在代码中手动flush,保证对两张表的update不会出现交替的情况。

3、部分大范围扫描的select和update混合也会导致死锁
解决方法:优化sql,尽量减少SQL语句,通过给po增加持久化字段的方式减少关联查询

经过优化,大部分情况下数据库死锁的情况得以避免,另外奇怪的是通过事件探查器在死锁时并未发现锁升级的事件。但是在一些特殊情况下(例如多个并发汇聚的 直接联合),死锁依旧发生。最后不得不对方法进行synchronized关键字同步,这个通过synchronized flush完成。业务方法不必同步,最后批量 *** 作数据库时进行同步。

换oracle进行测试,在未synchronized的情况下,未发生死锁情况。由此可见sqlserver与oracle锁实现机制存在很大的差别。 对sqlserver鄙视之。另,同事说,sqlserver2005后性能和机制发生了很大的变化,未测试。

补充一下我的一个最简单情况下的测试用例:
PO:

public   class  TestPO {
    String ID;
    String name;
    
int  num;
    
    

.
}


映射文件 hibernate3:

< hibernate - mapPing  default - access = " fIEld " >
  
< class  table = " WFMS_TESTPO "  name = " com.eway.workflow.test.po.TestPO " >

    
< ID name = " ID "  column = " ID " >< generator  class = " uuID "   /></ ID >

    
< property name = " name "  column = " name "  type = " string " />

    
< property name = " num "  column = " NUM "  type = " integer " />

  
</ class >
</ hibernate - mapPing >


被测试方法(都配置有事务):

     public   voID  testSave( int  num) {
        TestPO po 
=   new  TestPO();
        po.setname(
" ronghao " );
        po.setNum(num);
        theadTestDao.save(po);
        po.setname(
" haorong " );
    }

    
public   voID  testSaveByJdbc( int  num) {
        String sql 
=   " insert into WFMS_TESTPO (ID,name,NUM) values (?,'RONGHAO',?) " ;
        Object[] params 
=   new  Object[]{num,num};
        jdbcTemplate.update(sql, params);
        sql
= " update WFMS_TESTPO set name='haorong' where ID=? "   ;
        params 
=   new  Object[]{num};
        jdbcTemplate.update(sql, params);
    }


测试用例:

      public   voID  testSave()  throws  Exception {
        TheadtestTemplate template 
=   new  TheadtestTemplate();
        template.execute(
new  TheadtestCallback() {
            
public   voID  doInThead( int  suquence) {
//                theadTestManager.testSave(suquence);
                theadTestManager.testSaveByJdbc(suquence);
            }
        }, 
10 );
    }


测试结果:不论是hibernate还是jdbc,并发情况下都很快就会引起sqlserver2000的死锁,换用两种数据库驱动jtds和 jturbo死锁的情况没有变化。

结论 :sqlserver2000数据库的lock配置策略,不支持,或者数据库本身,就不支持对不同的行做同时 *** 作 (或者支持不完善),所谓的行锁支持很不完善,死锁情况非常容易发生。 补充:我对数据库的一些实现机制也并不是很了解,所以这里也只能列出现象而不能解释死锁的根本原因。另外感谢Alex的讨论。

总结

以上是内存溢出为你收集整理的高并发测试下的一些问题及解决全部内容,希望文章能够帮你解决高并发测试下的一些问题及解决所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1182484.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存