(原创)ADO.NET数据库优化超级技巧之程序池
一宿没睡终于搞清楚了,值得一看,.NET优化重磅炸弹
SqlConnection 在被建立且没有被Dispose()释放的情况下(即不为NULL),依旧可以被SqlDataAdapter ,dataset智能读取.即SqlConnection的状态为Close()或Open()都可以填充dataset。
请注意,如果数据库当前状态为关闭状态SqlDataAdapter能够自动打开数据库填充dataset并在填充完以后自动关闭。如果数据库当前状态为打开的状态SqlDataAdapter填充完以后并不会为你关闭数据库连接。如果你Open()的数据库连接忘记关闭,就会存在一个孤立连接,与ADO即ASP不同,.NET 垃圾回收器不会为您关闭 SqlConnection 并进行清理。出现这种情况的后果就是网站间断性变慢,再就是给程序池连施加的压力如果过大,导致程序池自动回收,程序池回收网站的session变量也将全部丢失。
SqlConnection每open()一次数据库就需要建立一个程序池,即使使用Dispose()的连接也不会立即释放,如果你的代码是这样写的:
Conn.Open();
DataSet dataSet = new DataSet();
new SqlDataAdapter(sql,Conn).Fill(dataSet);
Conn.Close();
Conn.Dispose();
那么很不幸,你的网站很可能经常罢工。
Conn.Dispose()会释放SqlConnection但不会立即释放程序池。程序池系统默认的最大连接池为100,如果你试图设定打开超过100的程序池连接数,ADO.NET 会使应用程序的连接请求排队等候,直到有空闲的连接。上述代码你如果连续刷新100次到101次就会出现漫长的等待并提示程序池已达到最大连接数的错误。之后系统会在几分钟之后释放所有的程序池,网站又可以访问了。注意应用程序池的连接数与网站连接数是完全不同的两个概念。前者最大只能是100后者可以是无限大。网站连接数达到几万,每天的访问量达到几十万需要几个甚至一个程序池连接就可以应付。
上述结论都是亲自测出来的,有兴趣的朋友也可以进行测试
<add key= "strconn " value= "server= " ";uid=sa;pwd=;database=db;max pool size=5 "/>
上面的配置代码中max pool size=5表示设置最大程序池连接数为5
参考资料http://www.microsoft.com/china/MSDN/library/data/sqlserver/TheNETConnectionPoolLifeguard.mspx?mfr=true
------解决方案--------------------up
------解决方案--------------------说了半天哪里说道优化了??
------解决方案--------------------优化捏?
------解决方案--------------------那要怎么做呢?学习