学习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();
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
独占一个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)));
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
#T#多次测试的平均结果:独占session的:718.75ms,建立数据库连接次数:151共享session的:781.25ms,建立数据库连接次数:1这个结果确实让我很吃惊,但足以证明了ADO.NET连接池做的是相当出色的。个人认为:共享的慢就慢在了采用了Transaction...。希望通过这个测试会让大家对连接池的性能认识有所提高。