应用程序中的Sql超时,但不在Sql Server Mgmt Studio中

时间:2014-03-11 23:53:17

标签: c# sql-server ado.net timeout

我有这个相对复杂的存储过程来执行数据库搜索。它长达400行,但是当我在Sql Server Management Studio中使用不会返回命中的搜索参数执行它时,需要大约1到3秒才能完成。执行返回几百行的搜索几乎需要相同的时间。

但是,当我从调用此存储过程的Web应用程序运行它时,使用完全相同的搜索参数,它基本上不会返回结果。我将连接和命令超时增加到5分钟,但仍然没有回来。事实上,在它抛出超时异常之前我需要5分钟。

在Web服务器和我的工作站上都​​会发生此超时,而不是生产数据库。

关于我可能面临的任何想法?代码是C#,我在using子句中运行Microsoft.Practices.EnterpriseLibrary代码以及直接的SqlClient代码,但没有。有19个参数,所以这是我最近尝试的缩短版本:

IList<QueryResultsItem> resultsItem = new List<QueryResultsItem>();

string connString = 
  "server=[servername];database=[dbname];uid=[userid];pwd=[psw];Connection Timeout=300";

SqlConnection conn = new SqlConnection(connString);
conn.Open();

SqlCommand cmd = new SqlCommand();
cmd.CommandTimeout = 300;
cmd.Connection = conn;
cmd.CommandText = "ap_tems_get_batch_history_list";
cmd.CommandType = CommandType.StoredProcedure;

SqlParameter parm = new SqlParameter();
parm.ParameterName = "@parm";
parm.Value = [value];
parm.Size = 3;
parm.SqlDbType = SqlDbType.Char;
cmd.Parameters.Add(parm);
...

SqlDataReader reader = cmd.ExecuteReader();

1 个答案:

答案 0 :(得分:2)

我在Web应用程序中遇到了很多这类超时问题。以下是我的发现。

  1. SSMS直接通过sql provider连接并对数据库执行。
  2. Web应用程序从IIS,业务层,...,然后是sql提供程序到数据库,遍历整个Microsoft堆栈。这是一个原因。
  3. 这是主要原因。您的C#代码构建了参数,并通过数据库模式/元数据/信息检查过程与数据库进行通信,这需要相当长的时间。如果在SqlDataReader周围设置调试器断点,您将发现大量元数据从数据库返回。
  4. 我的经验是,如果在SSMS中完成sql语句需要1秒以上的时间,您可能会在Web应用程序的默认设置中遇到超时问题。它更多地出现在选择中而不是插入或更新。

    我的解决方案:

    1. 增加web.config中的超时值;
    2. 使用执行计划对存储过程进行性能调整;
    3. 避免使用SqlDataReader。使用SqlCommand进行插入和更新;
    4. 如果必须使用SqlDataReader,则返回前100条记录而不是所有记录。