2013-04-08 49 views
0

我正在使用多线程应用程序从数据库提取数据,运行几分钟后我开始获取此异常或SQL超时异常。我的代码如下:sql server ExecuteReader需要一个开放且可用的Connection。连接的当前状态已关闭

public static List<FlightInfo> FlightInfoAllPricesPerDayForRoute(string From, string To) 
    { // Create the object array from the datareader 
     List<FlightInfo> arr = new List<FlightInfo>(); 
     using (var conn = new SqlConnection(sConnectionString)) 
     { 
      using (var command = new SqlCommand("FlightInfoAllPricesPerDayForRoute", conn) 
      { 
       CommandType = CommandType.StoredProcedure 
      }) 
      { 
       conn.Open(); command.CommandTimeout = 150; 
       command.Parameters.AddWithValue("AirportFrom", From); 
       command.Parameters.AddWithValue("AirportTo", To); 
       // command.Parameters.AddWithValue("Date", dt); 


       //execute the stored procedure 
       using (IDataReader dr = command.ExecuteReader()) 
       { 


        FlightInfo obj; 

        while (dr.Read()) 
        { 
         obj = new FlightInfo(); 
         obj.flightInfoID = (int)dr["FlightInfoID"]; 
         obj.airportFrom = (string)dr["AirportFrom"]; 
         obj.airportTo = (string)dr["AirportTo"]; 
         obj.timeDeparture = DateTime.Parse(dr["TimeDeparture"].ToString()); 
         obj.timeArrival = (DateTime)dr["TimeArrival"]; 
         obj.price = (short)Int16.Parse(dr["Price"].ToString()); 
         obj.dateAdded = (DateTime)dr["DateAdded"]; 
         obj.carrier = (string)dr["Carrier"]; 

         arr.Add(obj); 
        } 

        dr.Close(); dr.Dispose(); conn.Close(); conn.Dispose(); command.Dispose(); 


       } 
      } 
     } return arr; 
    } 

我加入了德下面的连接字符串,以提高超时问题,但我仍然得到错误:

Min Pool Size=200;Max Pool Size=32767;Asynchronous Processing=true; Connect Timeout=150; 

存储过程是非常简单的,所以我不认为这是一个问题有:

select *, DATEADD(dd, 0, DATEDIFF(dd, 0, TimeDeparture)) as FlightDate 
from FlightInfo 
where AirportFrom = @AirportFrom and AirportTo = @AirportTo 
AND TimeDeparture > GETDATE() -- Only get future flights 
Order by FlightDate ASC, Price asc 

我也试着运行此检查SQL连接,但我得到了“该用户没有执行此操作的权限”错误

SELECT * FROM sys.dm_exec_connections 

任何建议,将不胜感激!

回答

1

你的代码看起来不错 - 我建议你看看数据库服务器上的问题。如果存储过程需要很长时间才能运行和/或引起表中的大量锁定,则可能会遇到这些问题(尤其是在频繁调用时)。一些查询优化可能是按顺序的。

fyi - 你不需要围绕SqlCommand对象使用'using'块。此外,不需要在读者和连接对象上调用“close”和“dispose” - “使用”将为您处理。

+0

有没有办法增加SQL服务器的限制,因为我得到多个存储过程的这个错误,而不仅仅是这个?我已经将SP添加到了问题中。 – Damo 2013-04-08 23:56:24

+0

'增加限制'将是最后的手段。找到瓶颈是你需要做的。即使存储过程很简单,如果它正在访问没有适当索引的大表,它仍然需要很长时间。如果有大量的并发用户,特别是如果他们正在更新表,该过程可能被阻止。其他程序之一可能导致该问题。 – Ray 2013-04-09 00:09:58

+0

该应用程序正在脱机提取和分析数据(它不会驱动网站或类似的东西)。还有另一个应用程序将数据添加到数据库中,但速度为100插入/分钟,其他一些过程需要大约5秒钟才能运行,因为数据库拥有大约2000万条记录。该表已被索引为最好,我知道如何和数据访问速度似乎现在确定。我已经将应用程序中的并发线程数量减少到了10个,这有所帮助。有没有办法监视sql连接,看看他们大部分来自哪里? – Damo 2013-04-09 00:21:13

0

运行带有某些参数的SP时出现问题,因为代码插入数据库时​​出现问题,这意味着在某些情况下添加了许多重复条目。当我尝试使用具有许多重复数据库条目的参数从数据库提取数据时,SP运行速度非常缓慢。删除这些重复项目改善了问题。

相关问题