Отключение sp_reset_connection - PullRequest
       4

Отключение sp_reset_connection

4 голосов
/ 28 октября 2011

Из-за некоторых проблем, с которыми я сталкиваюсь, я экспериментирую с пулами соединений в .NET Framework 4. Используя SQL Profiler, я вижу, что каждый раз, когда соединение выбирается из пула соединений, выполняется хранимая процедура sp_reset_connection.

Чтобы избавиться от этого сброса (мне на самом деле не нужен sp_reset_connection).Я попытался установить для параметра «Сброс подключения» в строке подключения значение false, но это, похоже, не имеет никакого эффекта.Я думаю, что, возможно, я неправильно понимаю назначение параметра сброса соединения.

Я заметил, что параметр сброса соединения не задокументирован в http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx. Но он упоминается во многих других местах.Например, http://www.techrepublic.com/article/educate-yourself-about-net-sql-server-connection-string-syntax/6084879.

Если я установил для флага Conection Reset недопустимое значение (например, «hello»), я получаю исключение при открытии соединения, которое указывает на то, что флаг Reset Connection фактически используется.

Действительно ли ADO.NET заботится о флаге сброса соединения?

Мой код ниже:

  static void Main(string[] args)
  {
     const string connectionString =
        "Data Source=(local);Initial Catalog=MyDatabse;User ID=sa;Password=<removed>;Connection Timeout=5;Pooling=true;Min Pool Size=1; Max Pool Size=1; Enlist=false; Connection Reset=false;";

     var connections = new List<SqlConnection>();
     for (int i = 0; i < 1000000; i++)
     {
        using (var conn = new SqlConnection(connectionString))
        {
           conn.Open();

           SqlCommand command = new SqlCommand("SELECT * FROM DatabaseVersion", conn);
           command.ExecuteNonQuery();

           connections.Add(conn);
        }
     }
  }

1 Ответ

6 голосов
/ 29 октября 2011

SqlClient действительно проверяет флаг Connection Reset (он должен быть конвертируемым в логическое значение).Но начиная с версии .NET 3.5 SP1 значение игнорируется .

. Кроме того, свойство SqlConnectionStringBuilder.ConnectionReset устарело в .NET 3.5 SP1.

Причина в том, что настройка Connection Reset = false является огромной дырой в безопасности - она ​​может позволить повторно использовать сеанс, с которым связаны чувствительные элементы, такие как открытые симметричные ключи, временные ключи или контекст олицетворения.Кроме того, он мог выполнить ChangeDatabase для другой базы данных, поэтому при повторном открытии он будет подключен к «неправильной» базе данных.

Единственное преимущество установки Connection Reset = false - это повышение производительности в SQL Server 7.0.из-за недопущения поездки туда и обратно.

Connection Reset задокументировано в .NET 3.0 документах .Я предполагаю, что причина, по которой он был удален из документации 3.5 SP1 и более поздних, заключается в том, что теперь он ничего не делает.

...