Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Кто открывает лишний Connection?  [new]
Nick74
Member

Откуда:
Сообщений: 194
Подскажите что за механизм может самостоятельно инициировать создание нового Connection?

В программе на платформе Delphi идут два не сильно различающиеся запроса (Подключение через ADO, драйвер OLE DB SQL)
tmp = GetSQLVal( "select 1 from users where roles like '%Cp%' and (fullname like '"+man+"%' or fullname like '"+revman+"%')" );
tmp = GetSQLVal( "select min(id) from users where roles like '%Cp%' and (fullname like '"+man+"%' or fullname like '"+revman+"%')" );

Первый отрабатывает без проблем, после второго вдруг идет инициация нового соединения с исполнением запроса
declare @p1 int
set @p1=1
exec sp_prepare @p1 output,NULL,N'SELECT * FROM users',1
select @p1
, причем занимает все это около 3 секунд, хотя сами запросы обрабатываются почти мгновенно, табличка небольшая.
Прикладываю лог профайлера.

При исполнении через SQL studio никаких левых connections не создается.

К сообщению приложен файл. Размер - 45Kb
6 дек 12, 09:48    [13585667]     Ответить | Цитировать Сообщить модератору
 Re: Кто открывает лишний Connection?  [new]
Nick74
Member

Откуда:
Сообщений: 194
Microsoft SQL Server 2005 - 9.00.5292.00 (X64) Apr 13 2011 15:43:31 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1)
6 дек 12, 09:52    [13585685]     Ответить | Цитировать Сообщить модератору
 Re: Кто открывает лишний Connection?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
OLE DB Connection Pooling
6 дек 12, 09:56    [13585702]     Ответить | Цитировать Сообщить модератору
 Re: Кто открывает лишний Connection?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
Nick74
Подскажите что за механизм может самостоятельно инициировать создание нового Connection?
Код в вашей проге, больше нечему.

Сиквел сам не пишет себе запросы. Так что это либо какие то особенности средств доступа к сиквелу, либо (более вероятно) просто какой то код в вашей программе (возможно, какой то компонент приложения делает запрос)
6 дек 12, 09:59    [13585716]     Ответить | Цитировать Сообщить модератору
 Re: Кто открывает лишний Connection?  [new]
Nick74
Member

Откуда:
Сообщений: 194
pkarklin,

разве pooling не служит для уменьшения количества соединений, а не для их увеличения?

alexeyvg,

да, подозреваю ADO, проблема только понять зачем он это делает и почему не делал этого раньше...
6 дек 12, 10:18    [13585838]     Ответить | Цитировать Сообщить модератору
 Re: Кто открывает лишний Connection?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Nick74,

Если Ваш код недофичел, например, результат первого запроса, то у механизма доступа к данным нет другого пути, как открыть другой коннект.
6 дек 12, 10:25    [13585878]     Ответить | Цитировать Сообщить модератору
 Re: Кто открывает лишний Connection?  [new]
Nick74
Member

Откуда:
Сообщений: 194
pkarklin,

не, исключено. Попробовал сейчас только один этот запрос открыть и закрыть в отдельном приложении.
Никаких других запросов.
Результат тот же. Конкретно ADO не нравится именно этот запрос. Экспериментирую дальше.
  ADOConnection1.Open;
  ADOQuery1.Open;
  ADOQuery1.Close;
  ADOConnection1.Close
6 дек 12, 11:01    [13586193]     Ответить | Цитировать Сообщить модератору
 Re: Кто открывает лишний Connection?  [new]
Nick74
Member

Откуда:
Сообщений: 194
Похоже ADO таким образом читает метаструктуру таблиц, из которых идет выборка.
Проблема значит в том, что раньше это соединение проходило очень быстро, а сейчас с паузой 3 секунды...
6 дек 12, 11:59    [13586865]     Ответить | Цитировать Сообщить модератору
 Re: Кто открывает лишний Connection?  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2995
Nick74
Похоже ADO таким образом читает метаструктуру таблиц, из которых идет выборка.
Проблема значит в том, что раньше это соединение проходило очень быстро, а сейчас с паузой 3 секунды...

скорее всего, для первого запроса, он не считывает структуру таблиц, т.к она ему не нужна
select 1 from users where roles ...
6 дек 12, 13:48    [13587937]     Ответить | Цитировать Сообщить модератору
 Re: Кто открывает лишний Connection?  [new]
Оппть
Guest
Nick74
pkarklin,

не, исключено. Попробовал сейчас только один этот запрос открыть и закрыть в отдельном приложении.
Никаких других запросов.
Результат тот же. Конкретно ADO не нравится именно этот запрос. Экспериментирую дальше.
  ADOConnection1.Open;
  ADOQuery1.Open;
  ADOQuery1.Close;
  ADOConnection1.Close


Проверьте, чтобы для всех объектов (ADOConnection, ADODataSet или что вы там используете) свойство CursorLocation было выставлено clUseClient. Проблема уйдет сама собой.
pkarklin прав, если есть незакрытый серверный курсор - то ADO создает дополнительный коннект. Лет 10 назад мы с этим сильно обламывались, потому что использовали Application Role (понятно, что для доп. соединения никто не вызывает sp_setapprole).
6 дек 12, 13:59    [13587997]     Ответить | Цитировать Сообщить модератору
 Re: Кто открывает лишний Connection?  [new]
Nick74
Member

Откуда:
Сообщений: 194
Оппть,

один ADOConnection. Один ADOQuery. Оба в clUseClient. Один запрос.
Ну что может там быть незакрытого? )
То, что выше - это весь код приложения.
Кстати, работает так для любого запроса вида select max(id) from Tbl, даже если в Tbl всего 20 записей.
6 дек 12, 15:39    [13588812]     Ответить | Цитировать Сообщить модератору
 Re: Кто открывает лишний Connection?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Nick74
Ну что может там быть незакрытого? )

Не выбраны все результаты там может быть
6 дек 12, 15:41    [13588826]     Ответить | Цитировать Сообщить модератору
 Re: Кто открывает лишний Connection?  [new]
Nick74
Member

Откуда:
Сообщений: 194
Glory,

А что, обязательно фетчить все записи? Я просто открываю запрос и сразу закрываю.

Кстати - мысль.... Проверил - лишний Connect открывается в момент исполнения
ADOQuery1.Open и управление не возвращается вплоть до исполнения этого лишнего запроса.
То есть таки да - ADO зачем-то читает структуру в момент открытия запроса с группировкой.
6 дек 12, 15:55    [13588958]     Ответить | Цитировать Сообщить модератору
 Re: Кто открывает лишний Connection?  [new]
Сергей Васкецов
Member

Откуда:
Сообщений: 20362
марс?
6 дек 12, 16:50    [13589426]     Ответить | Цитировать Сообщить модератору
 Re: Кто открывает лишний Connection?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Сергей Васкецов,

Трудно ожидать от обычного запроса SELECT MARS, IMHO.
6 дек 12, 16:54    [13589458]     Ответить | Цитировать Сообщить модератору
 Re: Кто открывает лишний Connection?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
Nick74
А что, обязательно фетчить все записи? Я просто открываю запрос и сразу закрываю.

Да.

Или закрывать открытый рекордсет т даже команду (рекордсетов может быть много).
6 дек 12, 16:59    [13589505]     Ответить | Цитировать Сообщить модератору
 Re: Кто открывает лишний Connection?  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
Ну а в этом... ADOQuery есть така проперть... ээээ... Prepared ? 6 Ways to Boost ADO Application Performance Правда старьё, но и у вас... что-то окаменелое, как я понял...
6 дек 12, 17:27    [13589715]     Ответить | Цитировать Сообщить модератору
 Re: Кто открывает лишний Connection?  [new]
Nick74
Member

Откуда:
Сообщений: 194
alexeyvg,

Ну это все в предположении, что запросов много.
А у меня проблема возникает уже на первом запросе. Возвращающем ровно один рекордсет. В момент открытия.
6 дек 12, 17:27    [13589716]     Ответить | Цитировать Сообщить модератору
 Re: Кто открывает лишний Connection?  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
а зачем вам нужен первый запрос?

select 1 from users ...


может вы с логикой тут что-то перемудрили
6 дек 12, 17:29    [13589739]     Ответить | Цитировать Сообщить модератору
 Re: Кто открывает лишний Connection?  [new]
Сергей Васкецов
Member

Откуда:
Сообщений: 20362
pkarklin
Трудно ожидать от обычного запроса SELECT MARS, IMHO.

Это не совсем "обычный запрос".
Это считай библиотека, которая явно получает метаданные, не знаю уж на кой они ей ))
Одно лишь "лишний Connect открывается в момент исполнения" уже настораживает.
В своё время при написании драйвера над dblib с этим пришлось посношаться, потому как тут либо шашечки, либо ехать, один поток, никаких mars, метаданные отдельным селектом, чуть что - сразу по рукам мессагой что данные фетчатся, идите покурите )).
В общем я б не исключал такой возможности ))
Но лучше прибить получение метаданных, если это возможно.
6 дек 12, 18:13    [13590065]     Ответить | Цитировать Сообщить модератору
 Re: Кто открывает лишний Connection?  [new]
Nick74
Member

Откуда:
Сообщений: 194
Konst_One,

да незачем, просто проверял все ли запросы такой ерундой страдают. Выяснилось, что не все.
Опять же, учитывая, что механизм обращения одинаков, исключаем идеи типа "Где-то ваш код зачем-то туда лезет"...
7 дек 12, 10:47    [13592445]     Ответить | Цитировать Сообщить модератору
 Re: Кто открывает лишний Connection?  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
чукча не читатель... тип запроса у вас... не помню cmdtext... prepared = true. ? возможно, дело просто в версии MDAC.
7 дек 12, 12:36    [13593465]     Ответить | Цитировать Сообщить модератору
 Re: Кто открывает лишний Connection?  [new]
Nick74
Member

Откуда:
Сообщений: 194
buser,
от настроек не зависит, пробовал разные варианты.
Версию МДАС как поменять слабо представляю, по-моему оно давно уже считается частью системы и апгрейдится само в сервис-паках.

При перезагрузке компа пауза в 3 секунды на переподключение исчезла, но лишний реконнект все равно создается...
Похоже все же это дефолтный механизм работы ADO...
7 дек 12, 15:03    [13595077]     Ответить | Цитировать Сообщить модератору
 Re: Кто открывает лишний Connection?  [new]
Sevolod
Member

Откуда:
Сообщений: 106
Nick74,

У вас у ADOQuery Prepared = true или False?
7 дек 12, 16:01    [13595645]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить