Я давно работаю над приложением 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» не будет завершен.
Это снижает общую производительность приложения и вызывает проблемы при извлечении данных. Я просмотрел Google и обнаружил, что «Threading» может быть полезным, но я не могу правильно выполнить многопоточность. Я не настолько знаком с такими вещами. Будет полезно, если вы сможете исправить проблему. Мой первый вызов хранимой процедуры:
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, то проблем нет. Так можно ли сделать отдельный SqlConnection для каждого вызова ExecuteQuery_SP. Если у вас есть какие-либо сомнения, пожалуйста, прокомментируйте. Спасибо
cmd.Transaction = SqlTrans;
Эта транзакция передается извне. Каковы настройки этой транзакции? Какие еще запросы выполняются в той же транзакции? Есть ли тупики? - person Alexander Petrov   schedule 08.11.2019SqlConnection
для доступа ко всем данным? Вы не должны этого делать. Создайте новыйSqlConnection
для каждого запроса. ADO.NET управляет пулом соединений внутри. - person Theodor Zoulias   schedule 08.11.2019