Как я могу сохранить Соединение открытым при выполнении нескольких запросов?

Это ожидаемое поведение сервера GC. Он настроен так, чтобы наилучшим образом использовать доступную память, и поэтому не будет собирать, если в нем действительно нет необходимости. Это действительно проблема? Операционная система способна передавать и выгружать память по мере необходимости, поэтому, если вы работаете в 64-битной среде, это не должно иметь влияния в большинстве сценариев. Если это все еще вызывает беспокойство, есть несколько альтернатив:

  • Самое простое решение - переключиться на GC рабочей станции, что намного более агрессивно и собирает память через регулярные промежутки времени. Установка параметра gcServer на false активирует рабочую станцию ​​GC
  • Вы можете играть с количеством куч, выделенных GC. Если процессор имеет большое количество ядер, это может оказать заметное влияние. Это можно сделать с помощью настройки GCHeapCount. См. эту статью от Maoni Stephens для получения дополнительной информации
  • . Вы можете создать задание Windows , чтобы ограничить доступную для процесса память. Однако это намного сложнее, так как, насколько мне известно, в Windows нет встроенного инструмента, который бы делал это

.NET Core 3.0 принесет новые настройки для настройки ГХ для низких -сценарии, но он не будет выпущен до второго семестра.

7
задан GEOCHET 25 March 2009 в 18:42
поделиться

6 ответов

Хотя Вы еще не можете знать это, Вы делаете его правильно.

Откройте соединение, сделайте Ваш запрос, закройте его. Предпочтительно использование a using блок или try/finally.

Это может походить на большое количество издержек, но пул соединения в Поставщике данных Платформы.NET для SQL Server на самом деле оптимизирует это для Вас.

На самом деле закрытие соединения рекомендуется. Вот кавычка из документации:

Рекомендуется всегда закрывать Соединение, когда Вы закончены с помощью него для соединения, которое будет возвращено к пулу. Это может быть сделано с помощью или Завершения или Расположить методы объекта Соединения. Соединения, которые явно не закрываются, не могли бы быть добавлены или возвращены к пулу. Например, соединение, которое вышло из объема, но это не было явно закрыто, будет только возвращено к пулу соединения, если максимальный размер пула был достигнут, и соединение все еще подходящее.

Вот пример некоторого кода, который делает это:

try {
    conn.Open();
    // Perform query here
} finally {
    conn.Close();
}

Для ссылки:

http://msdn.microsoft.com/en-us/library/8xx3tyca (По сравнению с 71) .aspx

17
ответ дан 6 December 2019 в 09:22
поделиться

При использовании ASP.NET с той же строкой подключения, Вы будете использовать объединенное соединение, которое никогда не может физически закрываться, таким образом, Вы будете в значительной степени всегда использовать доступное открытое соединение.

2
ответ дан 6 December 2019 в 09:22
поделиться

Это очень возможно. Предположение, что Вы говорите о Соединении и DataReader. Если необходимо создать другое соединение каждый раз, когда оно кажется, что что-то идет не так, как надо.

Не видя кода, я предполагаю, что Вы оставляете DataReader открытым. Это - БОЛЬШАЯ ошибка. По умолчанию DataReaders полностью используют соединение, и отъезд его открылся, может привести утечки. Закройте DataReader, затем выполните другого. Я рекомендовал бы перенести DataReader в блок использования.

Ограбить

1
ответ дан 6 December 2019 в 09:22
поделиться

Короткий ответ: Да. Это должно быть возможно с большинством поставщиков данных.

Длинный ответ: Это зависит от того, что Вы используете для своего доступа к данным. Однако Вы, вероятно, не должны волноваться об этом. Многим платформам поставщика данных встроили организацию пула подключений, таким образом, последующее создание/открытие соединения не должно "действительно" открывать соединение.

0
ответ дан 6 December 2019 в 09:22
поделиться

Если Вы используете C# для открытия соединения. оператор использования использования поможет Вам очистить ресурс/соединение, даже если будет некоторый вывод excepion.

 using (SqlConnection connection =
                new SqlConnection(connectionString)
            {
                connection.Open();
                //issue command
            }

И считайте это:

http://msdn.microsoft.com/en-us/library/8xx3tyca (По сравнению с 71) .aspx, Вы можете, "Управляя Организацией пула подключений с Ключевыми словами Строки подключения", и система обработает объединение для Вас.

0
ответ дан 6 December 2019 в 09:22
поделиться

Несомненно, при использовании объекта SqlConnection, можно просто сделать что-то вроде этого:

connection.Open();
cmd.ExecuteReader(); // or any other form of getting the data
cmd2.ExecuteReader();
.
.
.
.
connection.Close();

Я также хотел бы добавить, если Вы используете несколько SqlDataAdapters для своих запросов, хотя Вы обычно не должны открывать соединение собой ПРИ ДЕЙСТВИТЕЛЬНО явном вызове соединения. Открытый () это затем не закроет соединение для Вас автоматически, позволяя Вам выполнить несколько запросов только с одним соединением.

0
ответ дан 6 December 2019 в 09:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: