【发布时间】:2020-03-05 07:15:50
【问题描述】:
我已经在一个 ASP.Net 应用程序上工作了很长时间,并且有超过 10 个客户端在使用该应用程序。但是现在我在应用程序中发现了一个问题,就是我有一个存储过程调用,大约需要30秒才能执行。这不是问题,因为 SQL 代码高度复杂且循环多次。问题是 : 每当执行该存储过程调用时,我都无法使用任何其他函数或存储过程调用。 当我尝试调试时,问题是“DataAdapter.Fill()”函数正在等待第一个存储过程调用完成。
我执行存储过程调用并返回数据的代码是:
public static DataSet ExecuteQuery_SP(string ProcedureName, object[,] ParamArray)
{
SqlDataAdapter DataAdapter = new SqlDataAdapter();
DataSet DS = new DataSet();
try
{
if (CON.State != ConnectionState.Open)
OpenConnection();
SqlCommand cmd = new SqlCommand();
cmd.CommandTimeout = 0;
cmd.CommandText = ProcedureName;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = CON;
cmd.Transaction = SqlTrans;
string ParamName;
object ParamValue;
for (int i = 0; i < ParamArray.Length / 2; i++)
{
ParamName = ParamArray[i, 0].ToString();
ParamValue = ParamArray[i, 1];
cmd.Parameters.AddWithValue(ParamName, ParamValue);
}
DataAdapter = new SqlDataAdapter(cmd);
DataAdapter.Fill(DS);
cmd.CommandText = "";
}
catch (Exception ea)
{
}
return DS;
}
所有存储过程调用都通过此函数进行。因此,当我的第一个存储过程调用“A”正在运行时,存储过程调用“B”在“A”完成之前不会执行。
这会降低应用程序的整体性能并导致数据检索出现问题。 我浏览了谷歌,发现“线程”可能会有所帮助,但我无法正确执行线程。我对这类事情不是很熟悉。如果您可以纠正问题,这将很有帮助。 我的第一个存储过程调用是:
ds = DB.ExecuteQuery_SP("SelectOutstandingReportDetailed", parArray);
其中 ds 是 DataSet 对象。 第二个存储过程调用是:
ds = DB.ExecuteQuery_SP("[SelectAccLedgersDetailsByID]", ParamArray);
我当前的数据库连接打开功能是:
public static bool OpenConnection()
{
try
{
Server = (String)HttpContext.GetGlobalResourceObject("Resource", "Server");
DBName = (String)HttpContext.GetGlobalResourceObject("Resource", "DBName");
UserName = (String)HttpContext.GetGlobalResourceObject("Resource", "UserName");
PassWord = (String)HttpContext.GetGlobalResourceObject("Resource", "PassWord");
string ConnectionString;
ConnectionString = "server=" + Server + "; database=" + DBName + "; uid=" + UserName + "; pwd=" + PassWord + "; Pooling='true';Max Pool Size=100;MultipleActiveResultSets=true;Asynchronous Processing=true";
CON.ConnectionString = ConnectionString;
if (CON.State != ConnectionState.Open)
{
CON.Close();
CON.Open();
}
}
catch (Exception ea)
{
}
return false;
}
其中 'CON' 是一个公共 SqlConnection 变量
static SqlConnection CON = new SqlConnection();
我发现了问题,就是所有的存储过程调用都是通过这个'CON'对象来执行的。如果每个存储过程调用都有单独的 SqlConnection 对象,则没有问题。 那么是否可以为每个 ExecuteQuery_SP 调用创建单独的 SqlConnection 。 如果有任何疑问,请发表评论。 谢谢你
【问题讨论】:
-
"所有存储过程调用都通过这个函数工作。"那不要用同一种方法来执行不同的存储过程?
-
ExecuteQuery_SP 函数是打开数据库连接的常用函数。我不能为每个存储过程调用提供单独的函数,因为将有大约一百个存储过程调用@IrishChieftain
-
docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/… -- 你试过这个吗?抱歉,一开始语言错误。让我看看 C# 是否有类似的东西。
-
这就是所谓的数据层。您有不同的数据访问方法,每种方法都可能调用存储过程。试一试。
-
您是否使用单个
SqlConnection进行所有数据访问?你不应该那样做。为每个请求创建一个新的SqlConnection。 ADO.NET 在内部管理 connection pool。
标签: c# asp.net multithreading stored-procedures dataadapter