Shared SqlConnection - PullRequest
       21

Shared SqlConnection

5 голосов
/ 23 мая 2009

Является ли хорошей практикой иметь один общий объект SqlConnection в приложении .NET для использования для всех ваших соединений с базой данных, или у вас должен быть отдельный объект при каждом доступе к базе данных?

В настоящее время у меня есть общий и, похоже, внезапно возникают проблемы. Кажется, я не могу использовать общий, когда мне нужно использовать режим аутентификации SQL вместо режима аутентификации Windows. Я впервые попробовал использовать проверку подлинности SQL, и она выдала мне эту ошибку, когда я попытался использовать то же соединение во второй раз:

Уже есть открытый DataReader, связанный с этой командой, который должен быть закрыт первым.

Ответы [ 6 ]

4 голосов
/ 23 мая 2009

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

3 голосов
/ 23 мая 2009

Эта ошибка не имеет абсолютно никакого отношения к аутентификации. Вы повторно используете соединение из середины, прежде чем закрыли свой SqlDataReader, возвращенный из ExecuteReader (). Это запрещено Вы должны проверить свой код и устранить вашу проблему. Существуют альтернативы использованию MARS ( несколько активных наборов записей ), но я бы настоятельно не рекомендовал это.

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

2 голосов
/ 25 мая 2009

Ваша проблема в том, что вы пытаетесь использовать соединение, которое в данный момент используется SqlDataReader. Вы не можете сделать это. Когда вы используете SqlDataReader, вы должны закрыть его, прежде чем повторно использовать используемое соединение. Я предлагаю вам создавать разные соединения каждый раз, когда вы получаете доступ к БД (в любое время, не только с SqlDataReaders). Если у вас включен пул, то сама структура (или SqlServer?) Будет по возможности использовать соединения.

Если вам нужен последовательный доступ к БД, скажем, вы делаете выбор, затем другой выбор, а затем обновление, вы можете повторно использовать соединение (я имею в виду тот же экземпляр SqlConnection), но если вам нужен доступ к БД при чтении из SqlDataReader, вам понадобятся 2 разных соединения.

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

1 голос
/ 23 мая 2009

Хотя для одного потока может быть лучше использовать один объект SqlConnection, он предъявляет требования к ценному ресурсу, являющемуся вашим сервером базы данных, висящим на соединении, и, следовательно, к ресурсам БД сервера, дольше, чем нужно. 1001 *

Лучше создать экземпляр SqlConnection за максимально короткий промежуток времени. Пул соединений снижает большую часть затрат на настройку соединения и обеспечивает наиболее эффективное использование ресурсов базы данных.

1 голос
/ 23 мая 2009

Многое из этого может быть dup здесь ; Короче говоря, в большинстве случаев сохраняйте связи недолговечными и локальными. Re считыватель данных; возможно включить MARS ?

0 голосов
/ 23 мая 2009

Если вы используете SQL Server 2000, это может ответить на ваш вопрос.

Победившим ответом, по-видимому, является «Это связано с изменением настроек по умолчанию для MAR. Он был включен по умолчанию, и мы изменили его на выключенный по умолчанию после RC1. Поэтому просто измените строку подключения, чтобы добавить ее». обратно (добавьте MultipleActiveResultSets = True в строку подключения). "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...