Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
один ADO Connection для многих клиентов
|
|||
|---|---|---|---|
|
#18+
Нужно сделать 1 коннект (должен находится на сервере части проги) к БД для многих клиентов (клиентские приложения). Для начала пробую сделать все в одном приложении: uses ADODB_tlb; //Import Type Library - "Microsoft ActiveX Data Objects 2.7" var c: _Connection; rs1, rs2: _RecordSet; begin c:=ADODB_tlb.CoConnection.Create; c.ConnectionString:= 'Provider=MSDAORA.1;' +'Password=guest;' +'User ID=guest;' +'Data Source=orcl'; c.CursorLocation:=adUseClient; c.Open('','','',-1); rs1:=ADODB_tlb.CoRecordset.Create; rs1.Open('select * from myTable1', c,adOpenStatic,adLockBatchOptimistic,adCmdText); rs2:=ADODB_tlb.CoRecordset.Create; rs2.Open('select * from myTable2', c,adOpenStatic,adLockBatchOptimistic,adCmdText); //.... end; Все прекрасно работает! Теперь нужно сделать один коннект, который возвращается СОМ-сервером Возвращаемый сервером результат (код сервера): var c: _Connection; //ГЛОБАЛЬНАЯ ПЕРЕМЕННАЯ fucntion TMyServer.Get_Connection: _Connection; begin if c = nil then begin c:=ADODB_tlb.CoConnection.Create; c.ConnectionString:='Provider=MSDAORA.1;' +'Password=guest;' +'User ID=guest;' +'Data Source=orcl'; c.CursorLocation:=adUseClient; c.Open('','','',-1); end; Result:=c; end; initialization TAutoObjectFactory.Create(ComServer, TMyServer, Class_MyServer, ciMultiInstance, tmApartment); end. 1. Делаю out-proc (в EXE) COM-сервер. Работаю с этим сервером (код клиента). var c: _Connection; i: IMyServer; begin i:=CoMyServer.Create;//Подсоединились к серверу c:=i.Get_Connection; ShowMessage(c.ConnectionString);//Все классно работает - обратились к свойству интерфейса и получили результат rs1:=ADODB_tlb.CoRecordset.Create; rs1.Open('select * from myTable1', c,adOpenStatic,adLockBatchOptimistic,adCmdText); //ERROR!!!!!!! При выполнении этого метода вылетает Exception "Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another" end; 2. Делаю in-proc (в DLL) COM-сервер. Клиент тот же самый, что и в первом случае. Здесь все нормально работает без всяких исключений. Но, когда я запускаю несколько клиентов, то у всех свой коннект к БД!! А мне нужен 1 коннект для всех клиентов!! Ведь по идее для каждого клиента должен создаваться серверный обьект, который ссылается на глобальную переменную c: _Connection и должен возвращать ее!!! Таким образом должен быть только 1 коннект к БД!! Вопрос: что мне сделать, чтобы заработал 1-й случай, или начал работать правильно 2-й? (желательно, 1-й) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2003, 15:00 |
|
||
|
один ADO Connection для многих клиентов
|
|||
|---|---|---|---|
|
#18+
Задача нерешабельна так как ADO само создаст дополнительные временные коннекты как только возникнет необходимость в параллельном исполнении запроса или фетчинге. Так что не ломай копей зазря. Чтобы объекты ADO могли передаваться между потоками, необходимо предварительно запустить на исполнение файлик makfre15.bat, который обычно располагается в каталоге C:\Program Files\Common Files\System\ado О передаче ADO-объектов между процессами мне ничего не известно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2003, 15:24 |
|
||
|
один ADO Connection для многих клиентов
|
|||
|---|---|---|---|
|
#18+
И никак нельзя заставить ADO создавать коннекты, когда ему захочется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2003, 18:10 |
|
||
|
один ADO Connection для многих клиентов
|
|||
|---|---|---|---|
|
#18+
Клиент тот же самый, что и в первом случае. Здесь все нормально работает без всяких исключений. >Но, когда я запускаю несколько клиентов, то у всех свой коннект к БД! Что-то нихрена не понятно в чем смысл всего этого, можно на пальцах суть проблемы нарисовать еще раз, а пока вот мое видение: Как это " ТЫ " " ЗАПУСКАЕШЬ " нескольких клиентов!!!???? Я так понимаю, что можно - на одной машине запустили прогу с коннектом к БД1 - на другой машине запустили прогу с коннектом к БД1 - на третей машине запустили прогу с коннектом к БД1 и какие же проблемы? >А мне нужен 1 коннект для всех клиентов!! Ведь по идее для каждого клиента ? В результате у каждого юзера свой user_name в качестве идентикатора и свой конект. И никто друг другу не мешает. В любом случае, когда запускаешь прогу на клиентской машине, надо конектиться к базе, а это должно быть заложено в самой проге. Ввел имя юзера и вперед юзай таблицы.... Удачи! Александр. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2003, 03:53 |
|
||
|
один ADO Connection для многих клиентов
|
|||
|---|---|---|---|
|
#18+
Смысл всего этого следующий. Есть ограничение на количество коннектов к БД (например к БД должен быть только один коннект от всех юзеров, и не более). Один из вариантов решения данной задачи - это использование СОМ-объекта, который раздает один единственный коннект к БД(который этот же СОМ-объект и установил) всем клиентам. Например, клиент говорит этому объекту, дай мне коннект, тот коннектится к БД и возвращает ему уже открытый _Connection....далее клиент работает с этим коннектом. Потом второй клиент говорит, дай мне коннект...объект возвращает ему тот же самый коннект, что и первому клиенту. И получается два клиента работают с БД, а на самом деле к БД только один коннект (данный коннект происходит от заранее определенного имени и все клиенты равноправны и, если клиенты получили доступ к данному коннекту, то они могут работать с БД от этого имени без ограничений)... Вообщем, если есть другие варианты решения, то не стесняйтесь и говорите :)). Или, как сделать, чтобы работал мой вариант, то тоже пишите. Задача еще усложняется тем, что клиенты могут быть написаны на разных языках...именно поэтому и используется ADO. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2003, 10:16 |
|
||
|
один ADO Connection для многих клиентов
|
|||
|---|---|---|---|
|
#18+
Если такое воплотить, то все клиенты будут ждать друг-друга, так как в одном коннекте невозможно выполнять параллельные операции. Этот принимается во внимание? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2003, 13:05 |
|
||
|
один ADO Connection для многих клиентов
|
|||
|---|---|---|---|
|
#18+
to Dankov: Да, принимается во внимание! Считается, что клиенты будут выполнять очень краткосрочные операции...... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2003, 16:32 |
|
||
|
один ADO Connection для многих клиентов
|
|||
|---|---|---|---|
|
#18+
>Есть ограничение на количество коннектов к БД Уж не про лицензионное соглашение ли ты мелкомягких. Если ты хочешь этим обойти число коннектов, то они и эту дырочку прикрыли. Не помню точную формулировку, но при многозвенке они считают, что если апп сервер имеет один коннект к базе, а с апп сервером работает 100 юзеров, то тебе, чтоб все было по ими писаному закону, все равно надо иметь 100 лицензий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2003, 16:47 |
|
||
|
один ADO Connection для многих клиентов
|
|||
|---|---|---|---|
|
#18+
2 pkarklin: Да, совершенно верно - все это делается из-за лицензионного соглашения....но не с мелкомягкими... А где можно достать данную инфу и прочитать подробнее? (возможно и MS SQL придется юзать) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2003, 17:02 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=32119779&tid=2118915]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
| others: | 218ms |
| total: | 353ms |

| 0 / 0 |
