学习ADO.NET连接池时,你可能会遇到性能问题:一个有近200个子单据的单据,提交时会非常慢,甚至会出现超出最大进程数这样的错误。查看代码,发觉对每个子单据都启动了流程,都要单独获取session与DB交互。查看DB中的session连接数,发觉每提交单据,session都会多达250+...。这里就把我的想法分享给大家。
想法:当时第一感觉就是认为问题应该是在这里,就有了这样的想法:改变每个单据都占用session,而共享一个session来与DB交互,以提高应用的性能。初步设定与DB得交互次数在150左右。想法验证
ADO.NET连接池共享一个session的测试
- try
- {
- conn.Open();
- connCount++;
- trans=conn.BeginTransaction();
- for(inti=0;i<50;i++)
- {
- stringrandom=rdm.Next().ToString();
- Insert(string.Format(insertSql1,"姓名"+random),trans);
- Insert(string.Format(insertSql2,"城市"+random),trans);
- Update(string.Format(updateSql,random),trans);
- }
- dt=Query(string.Format(querySql,rdm.Next(1,500)),trans);
- trans.Commit();
- }
- catch(Exceptionex)
- {
- if(null!=trans)
- trans.Rollback();
- Sav2File("TestConnectionWithOneexception:"+ex.Message);
- }
- finally
- {
- if(null!=conn)
- conn.Close();
- }
独占一个session的测试(每个方法里包含了获取session和释放session的操作)
- for(inti=0;i<50;i++)
- {
- stringrandom=rdm.Next().ToString();
- Insert(string.Format(insertSql1,"姓名"+random));
- Insert(string.Format(insertSql2,"城市"+random));
- Update(string.Format(updateSql,random));
- }
- DataTabledt=Query(string.Format(querySql,rdm.Next(1,500)));
#T#多次测试的平均结果:独占session的:718.75ms,建立数据库连接次数:151共享session的:781.25ms,建立数据库连接次数:1这个结果确实让我很吃惊,但足以证明了ADO.NET连接池做的是相当出色的。个人认为:共享的慢就慢在了采用了Transaction...。希望通过这个测试会让大家对连接池的性能认识有所提高。