Как вынудить SqlConnection к физически близкому при использовании организации пула подключений?

Лучше, если Вы не уничтожаете поток. Путь мог состоять в том, чтобы ввести блок "попытки" в цикл потока и выдать исключение, когда Вы хотите остановить поток (например, break/return/..., который останавливает Ваш for/while/...). Я использовал это на своем приложении, и оно работает...

40
задан Jeff Meatball Yang 19 July 2009 в 04:25
поделиться

5 ответов

Может быть SqlConnection.ClearPool ?

52
ответ дан 27 November 2019 в 01:28
поделиться

Обычно вы хотите, чтобы пул соединений выполнял свою работу - вы не хотите, чтобы соединение действительно закрылось.

Почему вы конкретно хотите, чтобы соединение не возвращалось в пул?

2
ответ дан 27 November 2019 в 01:28
поделиться

Если вы не хотите использовать пул соединений, вы необходимо указать его в свойстве SqlConnection.ConnectionString . Например,

"Data Source=MSSQL1;Database=AdventureWorks;Integrated Security=true;Pooling=false;"

Удаление или закрытие объекта SqlConnection просто закрывает соединение и возвращает его в пул соединений.

9
ответ дан 27 November 2019 в 01:28
поделиться

CommandBehavior.CloseConnection обычно не рекомендуется именно из-за этого факта - Вы не можете быть уверены, что соединение будет закрыто. (Я попытаюсь найти некоторые конкретные доказательства этого, я говорю это по слабому воспоминанию.)

Dispose () - самый надежный способ, потому что он неявно вызывает Close () .

Конструкция using , продемонстрированная @Alex, - это просто еще один (удобный для программистов) способ написания конструкции try-finally с добавленным неявным удалением объектов .

Редактировать: (после редактирования вопроса)

Ваше беспокойство по поводу закрытия соединений на самом деле кажется мне необоснованным. Соединение просто вернется в пул, чтобы его можно было легко использовать повторно, не выполняя всю инициализацию.

-2
ответ дан 27 November 2019 в 01:28
поделиться

Ответ Мо Сиско (вызов SqlConnection.ClearPool ) правильный.

Иногда вам нужно, чтобы соединение действительно закрылось, а не возвращалось в бассейн. В качестве примера у меня есть модульный тест, который создает временную базу данных, строит схему, тестирует некоторые вещи, а затем удаляет временную базу данных, если все тесты проходят.

Когда пул соединений активен, команда удаления базы данных завершается ошибкой, поскольку все еще существуют активные соединения. С точки зрения программиста все SQLConnections закрыты, но поскольку пул по-прежнему содержит одно открытое, SQL Server не допускает сброса.

Лучшая документация о том, как обрабатывается пул соединений, - эта страница о пуле подключений SQL Server в MSDN. Нельзя полностью отключать пул соединений, потому что он повышает производительность при повторных открытиях и закрытиях, но иногда вам нужно вызвать «принудительное закрытие» для SQLConnection, чтобы оно отпустило базу данных.

Это делается с помощью ClearPool. Если вы вызовете SqlConnection.ClearPool (connection) перед закрытием / удалением, при закрытии / удалении он действительно исчезнет.

25
ответ дан 27 November 2019 в 01:28
поделиться
Другие вопросы по тегам:

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