奇怪的IndexOutOfRangeException

不知道从什么时候开始,WebApplication 开始出现 IndexOutOfRangeException,也不是频繁出现,而是偶尔发生这种异常,真是奇怪。

Exception information: 
Exception type: IndexOutOfRangeException 
Exception message: 索引超出了数组界限。 
Stack trace:    在 
System.Data.SqlClient.SqlDataReader.ReadColumn(Int32 i, Boolean setTimeout)
   在 System.Data.SqlClient.SqlDataReader.GetValueInternal(Int32 i)
   在 System.Data.SqlClient.SqlDataReader.GetValue(Int32 i)
   在 System.Data.SqlClient.SqlDataReader.get_Item(Int32 i)
   在 dazaza.info.GetUserInfo(String name)

出现这种异常一般是因为 DataReader 没有读取到数据库中对应的列,但这里肯定不是这个原因引起的,因为提取数据库的 SQL 语句中是确信没有错误的,先前很长一段时间以来,程序运转非常正常,此后代码基本上没有修改,只是做了一些 Cache 功能,关键是,这个 IndexOutOfRangeException 异常是偶尔发生,而且一旦发生后,就会产生连锁效应,其它一些 DataReader 也跟着引发异常,甚至导致 IIS 的瘫痪!


引发异常的代码片段如下:

 using (System.Data.SqlClient.SqlDataReader drUser = new DataAccess.User().GetAUserFromView(Name))
{
    if (dr.HasRows == false)
    {
          throw new Exception("#by cacard:dr.HasRows==false : "+dr.FieldCount.ToString());
          //这里偶尔抛出异常,dr 没有 HasRows,但其 FieldCount 却是正确的
    }
   else(drUser.Read())
   {
         blog = drUser[0].ToString();
         //异常就在这里发生
   }
}

Google 了一下这个问题,原来老外被这个问题困了 2 年多了,具体请看这个链接,他们讨论了一大堆也没有找到原因和很好的解决方案,原因可能是:WebApplication 的访问量比较大,数据库 Pooling 存在问题,数据访问层使用了静态方法,ADO.NET 本身存在缺陷,或者 .NET 内存分配的问题。可尝试一下这些解决办法,过一段时间重启 IIS,关闭 Pooling,数据访问层不要使用静态方法,但问题依然存在。

原文地址:https://www.cnblogs.com/caca/p/1136815.html