【问题标题】:sql server ExecuteReader requires an open and available Connection. The connection's current state is closedsql server ExecuteReader 需要一个打开且可用的连接。连接的当前状态为关闭
【发布时间】:2013-04-08 23:33:26
【问题描述】:

我正在使用多线程应用程序从数据库中提取数据,运行几分钟后,我开始收到此异常或 sql 超时异常。我的代码如下:

    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 sql-server timeout


    【解决方案1】:

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

    fyi - 您不需要围绕 SqlCommand 对象的“使用”块。此外,无需在您的阅读器和连接对象上调用“关闭”和“处置”——“使用”将为您处理。

    【讨论】:

    • 当我在多个存储过程上遇到此错误时,有没有办法增加对 SQL 服务器的限制,而不仅仅是这个?我已将我的 SP 添加到问题中。
    • '增加限制'将是最后的手段。找到瓶颈是你需要做的。即使存储过程很简单,如果它正在访问一个没有适当索引的大表,它仍然可能需要很长时间。如果有很多并发用户,特别是如果他们正在更新表,则该过程可能会被阻止。其他过程之一可能会导致问题。
    • 应用程序正在离线提取和分析数据(它不会驱动网站或类似的东西)。还有另一个应用程序将数据添加到数据库中,但速度为 100 次插入/分钟,并且由于数据库有大约 2000 万条记录,其他一些过程大约需要 5 秒才能运行。该表已被索引为我所知道的最佳索引,并且数据访问速度现在似乎还可以。我已将应用程序中的并发线程数减少到 10 个,这很有帮助。有没有办法监控 sql 连接以查看它们中的大多数来自哪里?
    • 最简单的方法是使用ssms中的活动监视器。它显示了很多关于谁连接以及他们在做什么的信息。 “最近昂贵的查询”面板非常有帮助。还有一些商业工具可以帮助解决这个问题,以及可以用来获取更多信息的动态管理视图。我个人对这些没有太多经验,所以我不能推荐任何具体的东西。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多