更好的利用Ado.net连接池应如何打开和关闭连接呢?
对于Ado.net的连接池有什么作用,相信大家都比较了解了。当开启了连接池后我们应该如何打开和关闭连接才能更好地利用连接池所带给我们的好处呢?MS提倡我们尽可能每次的在连接使用完成后就关闭;这样导致每次都要进行打开和关闭操作或用using(){…}写起代码比较麻烦,还有经常对池的操作似乎也带来一些性能上的问题;在Asp.net里一个WebForm经常涉及有N个数据库操作,为了方便直接在init里打开一个连接,然后在Dispose里关闭即省事又能减少对池的操作提高性能;那到底这样做能不能提高性能呢?答案是能,但有些情况估计会很让你感觉到失望…。当池的连接数能应付用户请求的时候,的确是可以减少池的操作带来性能的提升;反之就不一样了用户必须等待到获取连接后才能进行其他操作,当有更多用户在等待获取连接的时候只能让线程处于更长等待时间导致服务总体处理能力下降。
以下做一次简单的测试:
测试方式是使用VS2008自带的负载测试,测试用户数是200,数据库连接池数设置20,测度时长10分钟。
测试代码1:
protected void Page_Load(object sender, EventArgs e)
{
using (System.Data.SqlClient.SqlConnection sqlconn= new System.Data.SqlClient.SqlConnection("data source=.;initial catalog=northwind;user id=sa;pwd=;Max Pool Size=20"))
{
sqlconn.Open();
System.Threading.Thread.Sleep(300);
}
}
测试代码2:
protected void Page_Load(object sender, EventArgs e)
{
using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection("data source=.;initial catalog=northwind;user id=sa;pwd=;Max Pool Size=20"))
{
sqlconn.Open();
}
System.Threading.Thread.Sleep(50);
using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection("data source=.;initial catalog=northwind;user id=sa;pwd=;Max Pool Size=20"))
{
sqlconn.Open();
}
System.Threading.Thread.Sleep(50);
using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection("data source=.;initial catalog=northwind;user id=sa;pwd=;Max Pool Size=20"))
{
sqlconn.Open();
}
System.Threading.Thread.Sleep(50);
using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection("data source=.;initial catalog=northwind;user id=sa;pwd=;Max Pool Size=20"))
{
sqlconn.Open();
}
System.Threading.Thread.Sleep(50);
using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection("data source=.;initial catalog=northwind;user id=sa;pwd=;Max Pool Size=20"))
{
sqlconn.Open();
}
System.Threading.Thread.Sleep(100);
}
测试结果1
测试结果2
从以上测试结果来看显然是MS所提倡的方式在某些情况是更好的,因为随着并发用户的提高,即用即断的方式总体上表现效果更佳。还有一点非常重要就是第一种代码方式会启用了池的最大数据库连接数,而第二种代码方式只使用了6个数据库连接;这一点进一步说明了,即用即断在某种情况下更节省数据库连接资源。
虽然结果这样但不代表是什么情况都使用即用即断好,当池不会让用户在门外等的情况是不需要用的,当N个数据库操作间没其他特别耗时的运算最好就用一个连接(对于这个耗时多长就根据你实际情况作出权衡了),对于什么情况应该怎样做其实通过测试就能找到答案。不过我个人推荐还是用MS提倡的:),本人一向都是采用这种方式。