![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли передать ADOConnection в другой процесс? [D7]
WondeRu © (2006-12-26 17:09:00)Создаем ADOConnection в одном процессе, а хоти его же пользовать в другом. Можно ли передать ADOConnection в другой процесс посредством COM(DCOM)? В dll можно, ведь тоже самое адресное пространство.
DiamondShark (2006-12-29 15:20:00) [1]
> Заботит количество коннектов - пиши трёхзвенку, это более
> правильно будет.
Не будет.
Правильно будет не хапать постоянные подключения.
Ega23 (2006-12-29 10:04:00) [2]В общем, ИМХО, это всё изврат. Заботит количество коннектов - пиши трёхзвенку, это более правильно будет.
AgainSlymRO (2006-12-29 06:37:00) [3]Сиглетон+Сервис + своя Iоболочка над Connection/dataset
alex_*** (2006-12-27 16:08:00) [4]
> ни какого хитрого маршалинга, ADO это COM ориентированная
> технология. Все интерфейсы уже имеются, достаточно просто
> передать интерфейс _Сonnection в другой процесс как IUnknown.
> Посмотрите исходники в Delphi в модуле ADOInt.pas - там
> есть описание.
>
ну если COM, то уже маршаллинг, а если
> работать с объектом который физически расположен на сервере!
то это уже Outproc server. И в случае другой машины, то DCOM. Кто будет outproc сервером?
isasa (2006-12-27 15:07:00) [5]Note (27.12.06 14:20) [10]
к серверу СУБД, другими словами 250 - максимально число сессий. Каждый коннект - это сессия
Кстати о птичках.
Редко, но все-же наблюдал(ситуация не стабильная), при использовании одного ADOConnection в двух потоках, ошибку,
invalid object #<table name>(на MS SQL)
которая стабильно исчезала при использовании объектов ##.
Хотя здесь речь идет об ORACLE но вышеприведенное свидетельствует о том, что возможно создание дополнительной сессии, со всеми вытекающими ...
Note (2006-12-27 14:20:00) [6]2 Ega23 ©
к серверу СУБД, другими словами 250 - максимально число сессий. Каждый коннект - это сессия
2 alex_*** ©
> Надо думать это будет хитрый маршаллинг для DCOM .
ни какого хитрого маршалинга, ADO это COM ориентированная технология. Все интерфейсы уже имеются, достаточно просто передать интерфейс _Сonnection в другой процесс как IUnknown. Посмотрите исходники в Delphi в модуле ADOInt.pas - там есть описание.
> Кстати не будет ли здесь гемора с настройкой прав на DCOM. Не нашел > АДО в DCOM config. Для какого объекта надо настраивать права?
ADO это набор in-proc COM server'ов (основной файл msado15.dll). Его так настраивать не надо.
alex_*** (2006-12-27 12:49:00) [7]
> Правильно думаете. Поэтому передают в другой процесс не
> Hаndle, а указатель на интерфейс, получить его можно обратившись
> к свойству ConnectionObject класса TADOConnection. Другой
> процесс (клиент) получив его будет работать с объектом который
> физически расположен на сервере!
Надо думать это будет хитрый маршаллинг для DCOM . Прикольно. Кстати не будет ли здесь гемора с настройкой прав на DCOM. Не нашел АДО в DCOM config. Для какого объекта надо настраивать права?
Ega23 (2006-12-27 12:28:00) [8]
> Oracle в бесплатной версии имеет ограничение на число коннектов
> – около 250.
К серверу или к базе?
Note (2006-12-27 12:04:00) [9]2 Ega23:
> А чем тебя ConnectionString не устраивает? Иначе рискуешь на коллизии пакетов нарваться.
ConnectionString не устраивает по той причине, что программ, которым требуется доступ к СУБД на одном компе будет достаточно много (скажем 20). Oracle в бесплатной версии имеет ограничение на число коннектов – около 250. И того получаем около 12 машин в системе. Не хочу вдаваться в подробности – но это ОЧЕНЬ мало. Варианта два: либо трёхзвенка в чистом виде, либо раздавать всем ADOConnection
>Иначе рискуешь на коллизии пакетов нарваться
Здесь о чём речь? Какой коллизии каких пакетов? ADOConnection потокозащищён. Все запросы отправленные через него в РАЗНЫХ потоков выстраиваются в ОЧЕРЕДЬ, т.е. выполняются ПОСЛЕДОВАТЕЛЬНО
>cкажи человеку, что либо 1 коннект на один поток (не процесс!), либо коннект с блокировкой от других потоков.
Сказали =) См. пост выше.
2 alex_*** ©
>Тогда передавать только Handle сессии самой ADO, но думаю из этого ничего не выйдет
Правильно думаете. Поэтому передают в другой процесс не Hаndle, а указатель на интерфейс, получить его можно обратившись к свойству ConnectionObject класса TADOConnection. Другой процесс (клиент) получив его будет работать с объектом который физически расположен на сервере!
2 MsGuns ©
> Но, как показывает практика, начинается резкое тормозилово ОС.
Это с каким кол-вом клиентов? Пробовал с 5-ю, работает, не тормозит.
alex_*** (2006-12-27 10:55:00) [10]А как можно?
MsGuns (2006-12-26 21:51:00) [11]Можно. Но, как показывает практика, начинается резкое тормозилово ОС. Приложение прекрасно реагирует на клавиатуру и мышь, а вот все остальное... Даже после простого нажатия правой кнопки на рабочем столе всплывающее меню появляется через десятки секунд.
Правда, коннект в асинхронноом режиме ;)
alex_*** (2006-12-26 18:19:00) [12]ты же сам говоришь что др. адресное просторанство. Тогда передавать только Handle сессии самой ADO, но думаю из этого ничего не выйдет. В АДО.НЕТ даже в пределах потока коннект не передается, только строка соединения, а ты хочешь другому процессу. Изврат и куча гемора, даже если удастся, потому как надо будет синхронизить вызовы м-ду процессами. Будет гораздо сложнее чем строку передать
Ega23 (2006-12-26 17:33:00) [13]
> Человек хочет один Connection на все его программы компа.
Скажи человеку, что либо 1 коннект на один поток (не процесс!), либо коннект с блокировкой от других потоков.
WondeRu (2006-12-26 17:13:00) [14]Не меня, тут "теологический" спор. Я с тобой согласен, что ConnectionString лучше. Человек хочет один Connection на все его программы компа.
Ega23 (2006-12-26 17:11:00) [15]А чем тебя ConnectionString не устраивает? Иначе рискуешь на коллизии пакетов нарваться.