【随笔★DataReader的疑惑】关于使用DataReader的一个很奇怪的问题,不应该用DataReader?

.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();
}

 

 

 

你可能感兴趣的:(reader)