.net读取数据集有两种方式:DataSet 和 DataReader
孰优孰劣我们暂且不论,我在做项目纯读取数据的时候选用了DataReader。
首先我确认用完之后关闭了,百分百确认。 reader,connection都close了,甚至都dispose了。
但是出现一个很奇怪的问题:
在sqlserver(2000)中查看进程,有非常多的sleeping进程,直到最后打开页面,提示超时,说连接池满。
错误提示:"超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小 "
1.我在连接字符串里加上了Pooling=false禁用了连接池,仍会出现上述问题,说明这些sleeping是sqlserver内部机制管理的。
2.当提示 "超时,说连接池满" 的时候,任然有很多sleeping的连接。
解决:将项目中所有使用DataReader的地方改用DataSet ,则不会再出现这个问题。
疑问:
1.为什么会出现这种情况,是否是因为DataReader本身的问题?如果是,那稍大并发的项目就不能用DataReader了。
2.有没有可能是sqlserver2000 本身的问题?
3.提示 超时,说连接池满 的时候,任然有很多sleeping的连接。 既然有空闲连接,为什么不用?
占用一下首页,求各位大牛不吝指教!
---------------------------------------------------------------
有博友说让贴代码,没有代码的确不好分析,但是项目中的代码是分层分散不太好贴。
我自己写了简单的测试,使用多线程模拟并发测试,也会出现上述问题。
代码如下:
string conString = "Server=.;database=northwind;user id=reader;password=123456;"; SqlConnection con = new SqlConnection(conString); SqlCommand cmd = new SqlCommand(); con.Open(); cmd.Connection = con; cmd.CommandText = "select * from Customers"; cmd.CommandType = CommandType.Text; using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)) { while (reader.Read()) { Thread.Sleep(30); }
reader.Close();
reader.Dispose();
con.Close();
con.Dispose();
}