Как отключить OLE DB от открытия дополнительных неявных соединений без пула? - PullRequest
0 голосов
/ 05 июля 2018

OLE DB имеет скрытую функцию, при которой, если ваше текущее соединение занято, оно автоматически открывает больше соединений с базой данных.

  • это происходит без вашего ведома
  • и они не взяты или не возвращены в пул соединений

В SQL Server 2005 «собственный клиент» компания Microsoft представила функцию, в которой одно соединение может поддерживать Множество активных наборов записей ; так что вы можете официально иметь несколько активных наборов записей через одиночное соединение. Но они отмечают, что включить его сложно, поэтому он включен с версии 2 бета-версии.

Секретные связи? Действительно?

Microsoft отмечает это поведение:

Использование ADO с собственным клиентом SQL Server

В предыдущих версиях поставщика OLE DB этот код вызывал бы создание неявного соединения при втором выполнении, поскольку только один активный набор результатов мог быть открыт для одного соединения. Поскольку неявное соединение не было помещено в пул соединений OLE DB, это может привести к дополнительным издержкам. С помощью функции MARS, предоставляемой поставщиком OLE DB для собственного клиента SQL Server, вы получаете несколько активных результатов для одного подключения.

Это также отметил Джон С. Гордон [MSFT] на форумах Microsoft: ( архив )

В OLE DB есть нечто, называемое «неявное соединение», порождаемое, когда запрос выполняется, пока активный набор результатов еще не завершен. Они не очевидны для пользователя, как заметил оригинальный постер. Я знаю, что SQLNCLI, SQLNCLI10 реализуют их, но я не помню, если SQLOLEDB делает. Затем происходит то, что сервер имеет 2 соединения, и у каждого есть один ожидающий результат. Это неприятно, когда выбранная вами модель лицензирования является подключением.

Это также отмечено в записи в блоге MARS: ( архив )

Использование MARS с собственным клиентом SQL [Chris Lee]

Второй набор результатов использует новое соединение каждый раз, когда оно открывается. Это явно имеет некоторые издержки (и оказывается, что дополнительные соединения не объединяются в пул, поэтому накладные расходы каждый раз связаны с полным обменом сетевым протоколом соединений с сервером). Это поведение по умолчанию для SQLOLEDB и собственного клиента SQL (OLE DB) - новое неявное соединение создается, когда основное соединение занято набором результатов по умолчанию.

Это функция глубоко внутри OLE DB, предназначенная для облегчения доступа к данным.

Бонусная болтовня

  • OLE DB - низкий уровень, сложный, API
  • ADO - упрощенная оболочка вокруг OLE DB

Как его отключить?

Это автоматическое создание вторичных соединений явно не годится. Не очень хорошо, что драйвер ODBC для SQL Server этого не делает (потому что это функция глубоко внутри OLE DB и поставляется бесплатно с драйверами OLE DB для SQL Server. Это не функция внутри ODBC).

Я хочу убедиться, что я не делаю этого. Для этого я хочу драйвер выдать ошибку в тот момент моего кода, где я случайно попытался это сделать.

Как отключить неявные дополнительные подключения OLE DB?

...