Сколько одновременных операторов поддерживает SqlConnection - PullRequest
1 голос
/ 06 мая 2020

Сколько одновременных операторов поддерживает C# SqlConnection?

Допустим, я работаю над сервисом Windows с 10 потоками. Все потоки используют один и тот же объект SqlConnection, но другой объект SqlCommand и выполняют такие операции, как выбор, вставка, обновление и удаление, либо в разных таблицах, либо в одной и той же таблице, но с разными данными. Это будет работать? Сможет ли один объект SqlConnection обрабатывать 10 одновременных операторов?

Ответы [ 2 ]

5 голосов
/ 06 мая 2020

Сколько одновременных операторов поддерживает C# SqlConnection?

Технически вы можете иметь несколько операторов «на лету», но только один исполняется на самом деле.

Одно соединение SqlConnection соответствует одному соединению и сеансу на SQL сервере. На сервере Sql сеанс может иметь только один активный запрос . Если вы включили MultipeActiveResultsets, вы можете начать новый запрос до того, как предыдущий будет завершен, но операторы чередуются, а не выполняются параллельно.

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

И

выполнение может быть переключено только в четко определенных точках.

https://docs.microsoft.com/en-us/sql/relational-databases/native-client/features/using-multiple-active-result-sets-mars?view=sql-server-ver15

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

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

2 голосов
/ 06 мая 2020

Дэвид Браун дал вам ответ на вопрос, но может быть что-то еще, что вам нужно знать:

Допустим, я работаю над службой Windows, выполняющей 10 потоков. Все потоки используют один и тот же объект SqlConnection, но другой объект SqlCommand, и выполняют такие операции, как выбор, вставка, обновление и удаление, либо в разных таблицах, либо в одной и той же таблице, но с разными данными.

Этот дизайн кажется неправильным по нескольким направлениям :

  1. У вас есть доступный ресурс и он открыт. Мое правило для Disposeable: «Создать. Использовать. Утилизировать. Все в одном фрагменте кода, в идеале с использованием блока using». Хранение одноразового материала вокруг или даже совместное использование его между потоками просто не стоит опасности забыть его закрыть.

Нет преимущества в производительности: SqlConnection использует пул внутренних соединений без каких-либо побочных эффектов. И даже если имеется соответствующее преимущество в скорости , они не стоят всех опасностей.

Вы используете многопоточное чтение с доступом к базе данных. Многопоточность - это один из способов реализации многозадачности, но не тот, который вам следует использовать, пока он вам не понадобится. Многопоточность полезна только при работе с ЦП. В противном случае вы обычно должны использовать async / await или аналогичные проверки. Операции с БД связаны либо с диском, либо с сетью.

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

Если у вас действительно тяжелая работа с процессором, скорее всего, вы теряете слишком много. Очень распространенная ошибка новичков - получить много, а затем выполнить фильтрацию в коде C#. Не делай этого. Сделайте как можно больше фильтрации и обработки в запросе. Вы не сможете превзойти скорость DB-сервера, и в лучшем случае вы ie бессмысленно настроите свою сеть.
...