Наличие кода ac #, который неправильно закрывает соединение SQL (вероятно) - PullRequest
0 голосов
/ 01 декабря 2019

Я столкнулся с проблемой, когда соединение с нашим SQL Server не закрыто должным образом. Я могу наблюдать за открытыми соединениями (спящими), используя sp_who2 или sp_who. Я делаю некоторые веб-звонки на сервер и вижу, как увеличивается количество подключений. При определенном количестве соединений я сталкиваюсь с Таймаутом. Веб-сайт, который я вызываю, имеет только следующий код (обфусцированный), который открывает соединение с SQL Server:

    private string getsomedetails(string Name, string applicationConnectionString)
{
  string empty = string.Empty;
  SqlCommand sqlCommand = new SqlCommand();
  sqlCommand.Connection = new SqlConnection(applicationConnectionString);
  sqlCommand.CommandText = "SELECT xx FROM dbo.xxx WHERE Name = @xyz";
  sqlCommand.Parameters.AddWithValue("@xyz", (object) Name);
  sqlCommand.Connection.Open();
  return sqlCommand.ExecuteScalar().ToString();
    }

Я понял, что соединение закрывается, когда оно находится в блоке, как описано выше. Но что происходит за исключением?

Моя строка подключения выглядит следующим образом:

      <connectionStrings>
<add name="AssetConnectionString"
     providerName="System.Data.SqlClient"
     connectionString= "server=SERVERNAME; 
                      database=DBNAME; 
                      uid=USERNAME; 
                      pwd=PASSWORD;
                      application name=APPNAME"
   />

Мой обходной путь - перезапустить пул приложений в IIS. После этого API будет реагировать как обычно.

Некоторые сведения: Microsoft SQL Server 2014 (SP3-CU4) (KB4500181) IIS версии 6.2

Я предполагаю, что в коде есть утечка, любаяза помощь проголосовали!

1 Ответ

3 голосов
/ 01 декабря 2019

Вам необходим блок «using» для автоматического закрытия соединения. Примерно так:

using (SqlConnection connection = new SqlConnection(myConnString))
                {
                    connection.Open();
                    SqlCommand cmd = new SqlCommand(fullSQLString, connection);
                    foreach (SqlParameter p in sqlParameters)
                        cmd.Parameters.Add(p);
                    cmd.ExecuteNonQuery();
                }

Соединение не закрывается только потому, что вы покинули область действия функции. Ключевым моментом является то, что потеря функциональной области автоматически не избавляется от объекта. Команда «using», однако, автоматически удаляет объект, когда заблокированная область действия завершена. Из документации Microsoft :

Оператор using определяет область, в конце которой будет расположен объект.

Когда блок кодаПосле выполнения и завершения процесс удаления «соединения» объекта SQLConnection приведет к закрытому соединению с БД.

Попробуйте этот формат:

private string getsomedetails(string Name, string applicationConnectionString)
{
     string empty = string.Empty;
     string SQLStr = "SELECT xx FROM dbo.xxx WHERE Name = @xyz";


     using(SqlConnection connection = new SqlConnection(applicationConnectionString))
        {
          connection.Open();
          SqlCommand sqlCommand = new SqlCommand(SQLStr, connection);
          sqlCommand.Parameters.AddWithValue("@xyz", (object) Name);
          return sqlCommand.ExecuteScalar().ToString();
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...