我正在使用多线程应用程序从数据库提取数据,运行几分钟后我开始获取此异常或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
任何建议,将不胜感激!
有没有办法增加SQL服务器的限制,因为我得到多个存储过程的这个错误,而不仅仅是这个?我已经将SP添加到了问题中。 – Damo 2013-04-08 23:56:24
'增加限制'将是最后的手段。找到瓶颈是你需要做的。即使存储过程很简单,如果它正在访问没有适当索引的大表,它仍然需要很长时间。如果有大量的并发用户,特别是如果他们正在更新表,该过程可能被阻止。其他程序之一可能导致该问题。 – Ray 2013-04-09 00:09:58
该应用程序正在脱机提取和分析数据(它不会驱动网站或类似的东西)。还有另一个应用程序将数据添加到数据库中,但速度为100插入/分钟,其他一些过程需要大约5秒钟才能运行,因为数据库拥有大约2000万条记录。该表已被索引为最好,我知道如何和数据访问速度似乎现在确定。我已经将应用程序中的并发线程数量减少到了10个,这有所帮助。有没有办法监视sql连接,看看他们大部分来自哪里? – Damo 2013-04-09 00:21:13