![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как обратиться к Default ADOConnection? [D7, MSSQL]
Aleksandr. © (2004-08-13 14:09:00)Под Default я имею в виду, что при создании ADODataSet ему можно указать свойством Connection компонент TADOConnection, а можно в свойство ConnectionString записать параметры соединения и коннектиться он будет через какое-то системное соединение (если по аналогии с TSession). Вот у меня бывает проблема - один объект для различных операций создает и отдает другим потокам объекты TADOQuery (которые в них затем и уничтожаются), а для связи им прописывает ConnectionString (пробовал сначала для них назначать свойство Connection, указывая туда ADOConnection выделяющего объекта, но что-то там какие-то ошибки OLE полезли). Так вот, если SQL-server рестартануть, то все ADODataSet, имеющие свой TADOConnection, восстанавливают подключение пересозданием этого объекта, а все ADODataSet, пытающиеся соединиться через строку подключения, связь установить не могут. То есть, насколько я понимаю, в программе остается висеть какой-то динамический ADOConnection, который никак не переинициализируется. Через что можно к нему обратиться?
KSergey (2004-08-14 09:37:00) [1]> [5] 46_55_41_44 © (13.08.04 15:49)
>
> > ADOQuery выделить свой объект ADOConnection
>
> Это уже слишком??? зачем??? у меня порядка 100 ADOQuery...
> Если не больше... и все работают с одним единственным ADOConnection...
Вопрос внимательно перечитаем? У него все в отдельных потоках!
Из разных потоков через один Connection - нельзя. Вот и [4] sniknik © (13.08.04 15:23)о том же пишет.
Автору: а может посмотреть в сторону асинхронного выполнения запросов в ADO - и этого будет достаточно, вместо кучи потоков? Благо дельфийские обертки поддерживают это в достаточной мере.
Ой, только не спрашивайте как. Есть справка, есть прекрасные статьи, в частности - на "Королевстве".
sniknik (2004-08-13 20:35:00) [2]> у меня сто потоков
чтото не так датском королевстве. ;о))
зачем в одной программе столько потоков? (просто не могу представить, хотя делал и больше (2000) но это для только теста, а вот в рабочей программе? зачем? максимум было пять (собственных, то что там компоненты создавали, ну типа инди сеть слушает, и т.д. не в счет))
> либо для каких-то действий создаетсявременный (впрочем, последних всего пять, но с ними проблема и есть - )
вот, это уже интересно, создается, и именно с ними проблемы... на чтото это намекает... только вот на что? явно чегото в вопросе не хватает. чего? хм...
Aleksandr. (2004-08-13 17:29:00) [3]Дык елки-палки, у меня сто потоков, у каждого ADOQuery либо имеется один, либо для каких-то действий создается временный (впрочем, последних всего пять, но с ними проблема и есть - ). Execute у каждого:
Coinitialize(nil);
try
InitConnections;
repeat
Do...
until Terminated
DoneConnections
finally
Couninitialize
end
46_55_41_44 (2004-08-13 15:49:00) [4]
> ADOQuery выделить свой объект ADOConnection
Это уже слишком??? зачем??? у меня порядка 100 ADOQuery... Если не больше... и все работают с одним единственным ADOConnection...
Еще один будет нужен, если подключиться к другой базе!
Но всего один на каждую БД, что тоже не обязательно, но все-таки лучше так, чтобы не запутаться!!!
sniknik (2004-08-13 15:23:00) [5]проблемы от количества врядли зависят, работает все одно одно ядро, сколько бы конектов к нему не было.
выделять для каждого квери свой конект необязательно, и лишнее(а у тебя так и происходит, если строкой то конект создается автоматически), достаточно конект один на поток. проблем с OLE быть не должно.
насчет ошибки "Connection destroyed", хотя ADO и делает резервирование ресурсов (прим. до 3 мин), чтобы частые подключения не тормозили, но это похоже не тот случай. наоборот это при клиентская часть (программа) выдает, такое впечатление что сервер (ядро ADO) уже рухнул/завершился, а к нему еще по старым конектам обращаются...
т.е. ищи глюк в программе, чтото ты не то делаеш. поток к примеру дестроиш вместо нормального завершения, или модель com (coinitialize) инициализировал но не закрыл, или наоборот открыл один раз закрыл два. и т.д. полный простор для воображения.
но вот что точно к "дефоултному" по твоему (первый открытый, т.к. они равноправны) обьекту тебе лезть не стоит, да и его может вполне просто не быть уже.
Aleksandr. (2004-08-13 14:36:00) [6]strelok-47 :
Не могут. Закрываешь-открываешь - не могут. Ошибка "Connection destroyed", а вот откуда они ее берут, хрен знает. Если параллельно создать объект ADOConnection с той же строкой подключения, то он прекрасно восстановит соединение (свое), а те, которые со строкой - так и останутся.
46_55_41_44 :
Я же объяснил, что сначала пытался тоже для каждого ADOQuery выделить свой объект ADOConnection, но очень быстро начались проблемы с Ole. Да и не удивительно, если около 100 датасетов начинают дергать свое соединение. А что до DataModule - так программа не того уровня. Она многопоточная плюс консольная.
46_55_41_44 (2004-08-13 14:22:00) [7]Слушай... В ADOQuery тоже есть Connection... И там тоже можно установить TADOConnection... и все...
Я например никогда в ADOQuery ConnectionString ну использую... зачем? Тогда всякая надобность ADOConnection отпадает!!! Бросаешь в датамодулт например 1 ADOConnection.. и все...всем ADOQuery или любым другим TADODataset устанавливаешь Connection := ADOConnection;
Я делаю так...
прекрасно работает... никаких тебе проблем!
strelok-47 (2004-08-13 14:15:00) [8]Связь не могут установить как? Ты их закрывешь-открываешь и они не могут?