连接到数据库时发生SQL超时错误

时间:2013-09-26 14:51:21

标签: c# sql-server database

我正在运行一个C#应用程序,它根据输入反复查询SQL Server 10.50.1617上的数据库。 SQL查询是应用程序中的嵌入资源。在过去它工作得很好。最近我们得到了更频繁的SQL“超时过期”错误,现在它正处于程序永远不会完成的时刻。我尝试改变程序如何连接到数据库的逻辑,以便查询更小但更多。这没有效果。

此外,从调试中我发现超时是随机发生的。例如,有时它甚至无法完成1个查询(在SSMS中直接完成时需要不到1秒的查询)。其他时候它会在第900次查询时超时。

我对这个主题进行了一些研究,发现其他人也有类似的问题(例如,这篇文章:SQL timeout expired on fast query

似乎提供了一些有用的建议,关于处理交易等等。但是,我认为我的主题背景要弱得多,例如集成C#(我通过Visual Studio使用)和数据库。所以我发现这些问题的答案很难理解。更糟糕的是,我试图用别人的代码解决这个问题,我原本没写过。

我希望有人可以提供更多外行人对我可能想要查看的一些事情的解释,因为我收到了这个错误。我对此非常陌生,虽然我理解了大部分术语,但我仍然围绕着所有活动部件。

我可能希望查看或考虑重新编写代码的哪些方面?这可能是我的C#代码的一个问题,或者可能是数据库存在一些问题(由于最初编写此应用程序,因此数据库已经大大增加,并且仍在继续这样做)任何建议都表示赞赏,请告诉我我可以提供的任何其他信息。

protected IEnumerable<IDictionary<string, object>> ExecuteQuery(
            string query,
            IDictionary<string, object> parameters,
            IEqualityComparer<string> comparer = null)
        {

            using (DbCommand command = GetCommand())
            {
                command.CommandText = query;
                if (parameters != null)
                {
                    foreach (var pair in parameters)
                    {
                        DbParameter parameter = command.CreateParameter();
                        parameter.ParameterName = string.IsNullOrEmpty(ParameterPrefix)
                            ? pair.Key
                            : ParameterPrefix + pair.Key;
                        parameter.Value = pair.Value == null ? DBNull.Value : pair.Value;
                        command.Parameters.Add(parameter);
                    }
                }
                using (DbDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        var dict = comparer == null
                            ? new Dictionary<string, object>(reader.FieldCount)
                            : new Dictionary<string, object>(reader.FieldCount, comparer);
                        for (int i = 0; i < reader.FieldCount; ++i)
                        {
                            dict[reader.GetName(i)] = reader[i] == DBNull.Value ? null : reader[i];
                        }
                        yield return dict;
                    }
                }
            }
        }

代码通常包含许多不同的.cs文件,所以我不确定哪个部分最有效率发布,但这里是在其他地方调用的函数,用于执行查询。我认为这可能是最相关的起点。

使用'using'语法调用数据库命令,理论上应该处理处理问题,我想...

1 个答案:

答案 0 :(得分:0)

对于超时的查询,基本上有两种解决方案。

首先,您必须确保设置了超时,以便只有在出现问题时才会触发,错误地说您想要放弃查询而不是等待一点。因此,例如,如果查询通常需要五秒钟,您可能希望超时更接近30秒。如果它们通常需要30秒,您可能需要超时2分钟或更长时间。

其次,您必须确保查询在尽可能短的时间内完成。

这不是具有通用答案的内容,但有很多建议可用于如何使查询运行得更快。如果这是一个相对较新的应用程序,很可能很少考虑适当的索引。但是,对于每个查询,最佳方法可能不同。