jacktank 2009-07-20
对于Ado.net的连接池有什么作用,相信大家都比较了解了。当开启了Ado.net连接池后我们应该如何打开和关闭连接才能更好地利用连接池所带给我们的好处呢?MS提倡我们尽可能每次的在连接使用完成后就关闭;这样导致每次都要进行打开和关闭操作或用using(){…}写起代码比较麻烦,还有经常对池的操作似乎也带来一些性能上的问题;在Asp.net里一个WebForm经常涉及有N个数据库操作,为了方便直接在init里打开一个连接,然后在Dispose里关闭即省事又能减少对池的操作提高性能;那到底这样做能不能提高性能呢?答案是能,但有些情况估计会很让你感觉到失望…。当池的连接数能应付用户请求的时候,的确是可以减少池的操作带来性能的提升;反之就不一样了用户必须等待到获取连接后才能进行其他操作,当有更多用户在等待获取连接的时候只能让线程处于更长等待时间导致服务总体处理能力下降。
以下为Ado.net连接池做一次简单的测试:
测试方式是使用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); }
Ado.net连接池测试结果1
Ado.net连接池测试结果2