我已经在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”正在运行时,直到“ A”完成,存储过程调用“ B”才会执行。
这会降低应用程序的整体性能,并导致数据检索出现问题。我浏览了google,发现“线程化”可能会有所帮助,但我无法正确执行线程化。我对这类事情不太熟悉。如果您可以解决此问题,将很有帮助。我的第一个存储过程调用是:
ds = DB.ExecuteQuery_SP("SelectOutstandingReportDetailed", parArray);
其中ds是DataSet对象。第二个存储过程调用为:
ds = DB.ExecuteQuery_SP("[SelectAccLedgersDetailsByID]", ParamArray);
[如果有任何疑问,请发表评论。谢谢
默认情况下,SQL Server将同时允许thousands of connections。这不是问题的根源。您已迫使对存储过程的每次调用都通过一个方法进行传递。排除对存储过程的调用-换句话说,丢失ExecuteQuery_SP方法是一个瓶颈。然后再次测试。