У меня есть сервер, на котором размещены 3 веб-приложения:
веб-приложение A используется нечасто.
веб-приложение B используется ежедневно, всего 13-14 пользователей. Это веб-приложение будет получать доступ к SQL Server для создания, чтения, обновления и удаления запросов.
Веб-приложение C — это браузер папок. Веб-приложение B добавит файлы в веб-приложение C.
Что касается спецификации сервера:
Спецификация сервера
Похоже, что SQL-сервер накапливая память. Через 1 неделю объем памяти может превысить 10 ГБ и начать тормозить из-за ошибки тайм-аута SQLException.
Использование памяти SQL Server
Я думал 80 ГБ ОЗУ будет достаточно, и SQL-сервер будет просто использовать ресурсы, учитывая, что я не менял значение максимального объема памяти.
Настройка памяти SQL Server по умолчанию
Веб-приложение B — это заказной, к которому прилагается запрос к SQL Server:
Код: Выделить всё
internal List GetDbDataSqlConnection(string commandText, Dictionary kvp, string columns, string company = null)
{
List dataList = new List();
try
{
using (SqlConnection sqlConnection = new SqlConnection($"data source={WebConfigurationManager.AppSettings["sqldatasource"]};initial catalog={company ?? WebConfigurationManager.AppSettings["defaultsqldb"]};user id={WebConfigurationManager.AppSettings["sqlusername"]};password={WebConfigurationManager.AppSettings["sqlpassword"]};MultipleActiveResultSets=True;App=EntityFramework"))
{
using (SqlCommand cmd = new SqlCommand { CommandText = commandText, CommandType = CommandType.Text, Connection = sqlConnection })
{
if (kvp != null) foreach (KeyValuePair p in kvp) cmd.Parameters.AddWithValue($"@{p.Key.Replace(".", string.Empty)}", p.Value);
sqlConnection.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
Dictionary data = new Dictionary();
foreach (string c in columns.Split(','))
{
string x = c.Contains(" AS ") ? c.Substring(c.IndexOf(" AS ") + 4) : c;
x = x.Replace("[", string.Empty).Replace("]", string.Empty);
x = x.Substring(x.IndexOf(".") + 1);
data.Add(x, Convert.ToString(reader[x]).Trim());
}
dataList.Add(data);
}
reader.Close();
}
sqlConnection.Close();
}
}
}
catch (Exception ex)
{
Logger.WriteLog($"[ERROR] on GetDbDataSqlConnection");
Logger.WriteLog($"Exception message : {ex.Message}");
Logger.WriteLog($"Exception : {ex}");
throw ex;
}
return dataList;
}
Спасибо.
Мне пришлось перезапустить службу SQL, после чего веб-приложение B снова стало гладким.
Изменить 1:
Я прилагаю результат запроса
Статистика ожидания
Изменить 2:
Веб-приложение B делает много вещей.
-
выберите данные непосредственно из SQL.
Мобильное приложение отправляет запрос GET в веб-приложение B.
Затем веб-приложение B выполняет SQL-запрос выбора и возвращает ответ на мобильное устройство. app. -
выполнить запрос API к веб-API
Мобильное приложение отправить POST-запрос в веб-приложение B.
Веб Приложение B выполняет проверку, состоящую из запроса выбора SQL, и отправляет запрос POST в веб-API. Веб-API также размещается на том же сервере. Ответ веб-приложения Б возвращается в мобильное приложение.
Код: Выделить всё
Exception : System.Data.SqlClient.SqlException (0x80131904): Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the server is not responding. ---> System.ComponentModel.Win32Exception (0x80004005): The wait operation timed out
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, Boolean shouldCacheForAlwaysEncrypted)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader()
at SalesMaster.Business.DataGeneral.DatabaseDataProcess.GetDbDataSqlConnection(String commandText, Dictionary`2 kvp, String columns, String company)
Источник: https://stackoverflow.com/questions/781 ... ut-of-80gb