2014-12-11 3 views
1

У меня есть серверная система, в которой у меня есть пул открытых SQL-соединений. Запросы поступают в серверную систему в разных потоках. Есть ли проблемы с каждым потоком запросов, чтобы выбрать открытое SQL-соединение из пула, использовать его, а затем вернуть его - все еще открыть - в пул снова? Сжато: разрешено ли использовать открытое SQL-соединение из разных потоков или это открытие SQL-соединения каким-то образом связано с потоком, который его открыл?Использование того же открытого SQL-соединения из разных потоков

+2

Вы изобретаете колесо? [Пул соединений] (http://msdn.microsoft.com/en-us/library/bb399543 (v = vs.110) .aspx) Также посмотрите примечание _Thread Safety_ на [SqlConnection] (http: // msdn .microsoft.com/en-us/library/system.data.sqlclient.sqlconnection (v = vs.110) .aspx) doc. – Steve

ответ

2

Не разделяйте SqlConnection объектов по областям, периоду. Это приводит к массивным головным болям, ни в коем случае не заботясь о том, чтобы выбросить их и создать новый, когда возникает ошибка (что делает невозможным соединение). Это не характерно для нескольких потоков; пытаясь подключиться к соединению, даже если только один поток когда-либо использует его, достаточно плохо.

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

Как правило, вам не нужно беспокоиться о пуле соединений, поскольку он «работает просто», но если вы хотите узнать больше (или нужно знать больше для целей настройки), см. «SQL Server Connection Pooling» в MSDN.

+0

Спасибо. Да, мой вопрос состоял в повторном использовании соединения SQL по потокам, а не в пуле соединений. Документация Microsoft не очень понятна. Поэтому я буду редизайн, поэтому соединения не будут использоваться в разных потоках. –

+0

@AndersHyldahl: в документации всегда есть шаблон, чтобы указать, что экземпляры не являются потокобезопасными (классы, для которых экземпляры * являются потокобезопасными, представляют собой небольшое меньшинство), но там почти никогда не документирует, имеют ли экземпляры * аффинность * для потока, потому что это еще меньшее меньшинство. Вы можете предположить, что если документы не являются более конкретными, вы можете использовать экземпляр из любого потока, если его использует не более одного потока за раз. В случае 'SqlConnection', точка является спорной, так как вы там нет веских оснований разделять экземпляры. –