Это ожидаемое поведение сервера GC. Он настроен так, чтобы наилучшим образом использовать доступную память, и поэтому не будет собирать, если в нем действительно нет необходимости. Это действительно проблема? Операционная система способна передавать и выгружать память по мере необходимости, поэтому, если вы работаете в 64-битной среде, это не должно иметь влияния в большинстве сценариев. Если это все еще вызывает беспокойство, есть несколько альтернатив:
gcServer
на false
активирует рабочую станцию GC GCHeapCount
. См. эту статью от Maoni Stephens для получения дополнительной информации .NET Core 3.0 принесет новые настройки для настройки ГХ для низких -сценарии, но он не будет выпущен до второго семестра.
Хотя Вы еще не можете знать это, Вы делаете его правильно.
Откройте соединение, сделайте Ваш запрос, закройте его. Предпочтительно использование 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
При использовании ASP.NET с той же строкой подключения, Вы будете использовать объединенное соединение, которое никогда не может физически закрываться, таким образом, Вы будете в значительной степени всегда использовать доступное открытое соединение.
Это очень возможно. Предположение, что Вы говорите о Соединении и DataReader. Если необходимо создать другое соединение каждый раз, когда оно кажется, что что-то идет не так, как надо.
Не видя кода, я предполагаю, что Вы оставляете DataReader открытым. Это - БОЛЬШАЯ ошибка. По умолчанию DataReaders полностью используют соединение, и отъезд его открылся, может привести утечки. Закройте DataReader, затем выполните другого. Я рекомендовал бы перенести DataReader в блок использования.
Ограбить
Короткий ответ: Да. Это должно быть возможно с большинством поставщиков данных.
Длинный ответ: Это зависит от того, что Вы используете для своего доступа к данным. Однако Вы, вероятно, не должны волноваться об этом. Многим платформам поставщика данных встроили организацию пула подключений, таким образом, последующее создание/открытие соединения не должно "действительно" открывать соединение.
Если Вы используете C# для открытия соединения. оператор использования использования поможет Вам очистить ресурс/соединение, даже если будет некоторый вывод excepion.
using (SqlConnection connection =
new SqlConnection(connectionString)
{
connection.Open();
//issue command
}
И считайте это:
http://msdn.microsoft.com/en-us/library/8xx3tyca (По сравнению с 71) .aspx, Вы можете, "Управляя Организацией пула подключений с Ключевыми словами Строки подключения", и система обработает объединение для Вас.
Несомненно, при использовании объекта SqlConnection, можно просто сделать что-то вроде этого:
connection.Open();
cmd.ExecuteReader(); // or any other form of getting the data
cmd2.ExecuteReader();
.
.
.
.
connection.Close();
Я также хотел бы добавить, если Вы используете несколько SqlDataAdapters для своих запросов, хотя Вы обычно не должны открывать соединение собой ПРИ ДЕЙСТВИТЕЛЬНО явном вызове соединения. Открытый () это затем не закроет соединение для Вас автоматически, позволяя Вам выполнить несколько запросов только с одним соединением.