用session测试ADO.NET连接池性能经验分享

来源:岁月联盟 编辑:exp 时间:2009-11-12

学习ADO.NET连接池时,你可能会遇到性能问题:一个有近200个子单据的单据,提交时会非常慢,甚至会出现超出最大进程数这样的错误。查看代码,发觉对每个子单据都启动了流程,都要单独获取session与DB交互。查看DB中的session连接数,发觉每提交单据,session都会多达250+...。这里就把我的想法分享给大家。

想法:当时第一感觉就是认为问题应该是在这里,就有了这样的想法:改变每个单据都占用session,而共享一个session来与DB交互,以提高应用的性能。初步设定与DB得交互次数在150左右。想法验证

ADO.NET连接池共享一个session的测试

  1. try  
  2. {  
  3. conn.Open();  
  4. connCount++;  
  5. trans=conn.BeginTransaction();  
  6. for(inti=0;i<50;i++)  
  7. {  
  8. stringrandom=rdm.Next().ToString();  
  9. Insert(string.Format(insertSql1,"姓名"+random),trans);  
  10. Insert(string.Format(insertSql2,"城市"+random),trans);  
  11. Update(string.Format(updateSql,random),trans);  
  12. }  
  13. dt=Query(string.Format(querySql,rdm.Next(1,500)),trans);  
  14. trans.Commit();  
  15. }  
  16. catch(Exceptionex)  
  17. {  
  18. if(null!=trans)  
  19. trans.Rollback();  
  20. Sav2File("TestConnectionWithOneexception:"+ex.Message);  
  21. }  
  22. finally  
  23. {  
  24. if(null!=conn)  
  25. conn.Close();  
  26.  
  27. }  

独占一个session的测试(每个方法里包含了获取session和释放session的操作)

  1. for(inti=0;i<50;i++)  
  2. {  
  3. stringrandom=rdm.Next().ToString();  
  4. Insert(string.Format(insertSql1,"姓名"+random));  
  5. Insert(string.Format(insertSql2,"城市"+random));  
  6. Update(string.Format(updateSql,random));  
  7. }  
  8.  
  9. DataTabledt=Query(string.Format(querySql,rdm.Next(1,500)));  

多次测试的平均结果:独占session的:718.75ms,建立数据库连接次数:151共享session的:781.25ms,建立数据库连接次数:1这个结果确实让我很吃惊,但足以证明了ADO.NET连接池做的是相当出色的。个人认为:共享的慢就慢在了采用了Transaction...。希望通过这个测试会让大家对连接池的性能认识有所提高。