gpt4 book ai didi

c# - 应用程序中的 SQL 超时,但不在 SQL Server Mgmt Studio 中

转载 作者:行者123 更新时间:2023-11-30 12:28:18 25 4
gpt4 key购买 nike

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

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

此超时同时发生在 Web 服务器和我的工作站上,与生产数据库相反。

关于我可能会遇到的问题有什么想法吗?代码是 C#,我已经运行了 Microsoft.Practices.EnterpriseLibrary 代码以及直接的 SqlClient 代码,在 using 子句内和没有 using 子句。有 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();

最佳答案

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

  1. SSMS 直接通过 sql 提供程序连接到数据库并对其执行。
  2. Web 应用程序通过整个 Microsoft 堆栈,从 IIS、业务层...,然后是 sql 提供程序到数据库。这是一个原因。
  3. 这是主要原因。您的 C# 代码构建参数,并通过数据库模式/元数据/信息检查过程与数据库对话,这需要相当长的时间。如果您在 SqlDataReader 周围设置调试器断点,您会发现从数据库返回大量元数据。

我的经验是,如果在 SSMS 中完成 sql 语句的时间超过 1 秒,您可能会在 Web 应用程序的默认设置中遇到超时问题。它在选择中比在插入或更新中更常发生。

我的解决方案:

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

关于c# - 应用程序中的 SQL 超时,但不在 SQL Server Mgmt Studio 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22339187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com