powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / один ADO Connection для многих клиентов
9 сообщений из 9, страница 1 из 1
один ADO Connection для многих клиентов
    #32119431
manumba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно сделать 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-й)
...
Рейтинг: 0 / 0
один ADO Connection для многих клиентов
    #32119456
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача нерешабельна так как ADO само создаст дополнительные временные коннекты как только возникнет необходимость в параллельном исполнении запроса или фетчинге. Так что не ломай копей зазря.

Чтобы объекты ADO могли передаваться между потоками, необходимо предварительно запустить на исполнение файлик makfre15.bat, который обычно располагается в каталоге C:\Program Files\Common Files\System\ado

О передаче ADO-объектов между процессами мне ничего не известно.
...
Рейтинг: 0 / 0
один ADO Connection для многих клиентов
    #32119629
manumba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И никак нельзя заставить ADO создавать коннекты, когда ему захочется?
...
Рейтинг: 0 / 0
один ADO Connection для многих клиентов
    #32119779
Alexander2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Клиент тот же самый, что и в первом случае. Здесь все нормально работает без всяких исключений.

>Но, когда я запускаю несколько клиентов, то у всех свой коннект к БД!

Что-то нихрена не понятно в чем смысл всего этого, можно на пальцах суть проблемы нарисовать еще раз, а пока вот мое видение:

Как это " ТЫ " " ЗАПУСКАЕШЬ " нескольких клиентов!!!????

Я так понимаю, что можно
- на одной машине запустили прогу с коннектом к БД1

- на другой машине запустили прогу с коннектом к БД1

- на третей машине запустили прогу с коннектом к БД1

и какие же проблемы?

>А мне нужен 1 коннект для всех клиентов!! Ведь по идее для каждого клиента ?

В результате у каждого юзера свой user_name в качестве идентикатора и свой конект. И никто друг другу не мешает.


В любом случае, когда запускаешь прогу на клиентской машине, надо конектиться к базе, а это должно быть заложено в самой проге. Ввел имя юзера и вперед юзай таблицы....

Удачи! Александр.
...
Рейтинг: 0 / 0
один ADO Connection для многих клиентов
    #32119904
manumba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смысл всего этого следующий. Есть ограничение на количество коннектов к БД (например к БД должен быть только один коннект от всех юзеров, и не более). Один из вариантов решения данной задачи - это использование СОМ-объекта, который раздает один единственный коннект к БД(который этот же СОМ-объект и установил) всем клиентам. Например, клиент говорит этому объекту, дай мне коннект, тот коннектится к БД и возвращает ему уже открытый _Connection....далее клиент работает с этим коннектом. Потом второй клиент говорит, дай мне коннект...объект возвращает ему тот же самый коннект, что и первому клиенту. И получается два клиента работают с БД, а на самом деле к БД только один коннект (данный коннект происходит от заранее определенного имени и все клиенты равноправны и, если клиенты получили доступ к данному коннекту, то они могут работать с БД от этого имени без ограничений)...

Вообщем, если есть другие варианты решения, то не стесняйтесь и говорите :)). Или, как сделать, чтобы работал мой вариант, то тоже пишите.
Задача еще усложняется тем, что клиенты могут быть написаны на разных языках...именно поэтому и используется ADO.
...
Рейтинг: 0 / 0
один ADO Connection для многих клиентов
    #32120095
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если такое воплотить, то все клиенты будут ждать друг-друга, так как в одном коннекте невозможно выполнять параллельные операции. Этот принимается во внимание?
...
Рейтинг: 0 / 0
один ADO Connection для многих клиентов
    #32120373
manumba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Dankov: Да, принимается во внимание! Считается, что клиенты будут выполнять очень краткосрочные операции......
...
Рейтинг: 0 / 0
один ADO Connection для многих клиентов
    #32120396
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Есть ограничение на количество коннектов к БД

Уж не про лицензионное соглашение ли ты мелкомягких. Если ты хочешь этим обойти число коннектов, то они и эту дырочку прикрыли. Не помню точную формулировку, но при многозвенке они считают, что если апп сервер имеет один коннект к базе, а с апп сервером работает 100 юзеров, то тебе, чтоб все было по ими писаному закону, все равно надо иметь 100 лицензий.
...
Рейтинг: 0 / 0
один ADO Connection для многих клиентов
    #32120419
manumba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 pkarklin: Да, совершенно верно - все это делается из-за лицензионного соглашения....но не с мелкомягкими...
А где можно достать данную инфу и прочитать подробнее? (возможно и MS SQL придется юзать)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / один ADO Connection для многих клиентов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]