Arquitetura Multi-Camadas

Delphi

28/04/2004

Pessoal,

Estou desenvolvendo um sistema multi-tier, com um servidor COM (DLL) e tecnologia MIDAS.

Tenho vários Remote DataModules no servidor e não consegui compartilhar uma conexão entre eles. Quando o servidor é um .EXE isso é fácil pois eu consigo colocar um DataModule, com uma conexão ao banco, que é criado automaticamente ao iniciar a aplicação e os Remote Datamodules conseguem acessa-lo de forma compartilhada. Mas com DLL parece nao funcionar da mesma forma.

Assim, coloquei um componente de conexão em cada Remote DataModule.

Gostaria de saber se existe uma outra forma de fazer isto pois, neste caso, eu ficaria com muitas conexões abertas com o banco e não me parece ser a melhor soluação.

[],

Guilherme


Gmcouto

Gmcouto

Curtidas 0

Respostas

Dessis Empresarial

Dessis Empresarial

28/04/2004

Estou com o mesmo problema amigo, mas ainda não consegui respostas...


GOSTEI 0
Rodolpho123

Rodolpho123

28/04/2004

Vc tem mesmo a necessidade de inserir diversos RemoteDataModule?


GOSTEI 0
Kotho

Kotho

28/04/2004

Fala ae moçada...

eu utilizo esta tecnologia, e posso dizer que não foi nada fácil conseguir ajuda...

eu vou tentar ajudar vocês através do fórum, até para que fique como fonte de pesquisa...

Talvez fique um pouco complicado de entender (pra mim foi um bocado)... mas eu vou tentar mesmo assim.

O grande segredo está na definição do _TLB...

no meu projeto está assim:

CoClass - RDM
Interface - IRDM
  ReadOnly property - SQLConnection
  ReadOnly property - RDMRelatorio
Interface - IBaseRDM
  ReadOnly property - SQLConnection
  WriteOnly property - SQLConnection
  ReadOnly property - RDM
  WriteOnly property - RDM
CoClass - RDMRelatorio
Interface IRDMRelatorio (herdando de IBaseRDM - Parent Interface)


Em meu RDM eu tenho os componentes de conexão com o banco.
no RDMRelatorio eu tenho os Querys de Relatórios...

no untRDM.pas eu tenho

function TRDM.Get_SQLConnection: Integer;
begin
  // o Integer serve para serializar o componente
  Result := Integer(SQLConnection1);
end;

function TRDM.Get_RDMRelatorio: IRDMRelatorio;
begin
  Result := RDMRelatorioFactory.CreateCOMObject(nil) as IRDMRelatorio;
  Result.RDM := Self;
  Result.SQLConnection := Integer(SQLConnection1);
end;


no untRDMRelatorio.pas eu tenho

function TRDMRelatorio.Get_RDM: IRDM;
begin
  Result := FRDM;
end;

procedure TRDMRelatorio.Set_RDM(const Value: IRDM);
begin
  FRDM := Value;
end;

function TRDMRelatorio.Get_SQLConnection: Integer;
begin
  Result := Integer(FRDM.SQLConnection);
end;

procedure TRDMRelatorio.Set_SQLConnection(Value: Integer);
var
  x: integer;
begin
  for x:=0 to ComponentCount -1 do
    if Components[x] is TCustomSQLDataSet then
      TSQLDataSet(Components[x]).SQLConnection := TSQLConnection(Value);
end;


As propriedades SQLConnection são necessárias para que quando houver mais de um usuário utilizando uma conexão, não haja confusão de threads.

No lado Client é mais fácil... adicione um componente TSharedConnection da palheta DataSnap... na propriedade ParentConnection, coloque o nome da TDComConnection, e na ChildName deverá aparecer o RDMRelatorio... nos ClientDataSet´s, ao invéz de usar o TDComConnection, utilize o TSharedConneciton...

Como eu disse no início... parece complicado mesmo... :P mas funciona muito bem...


GOSTEI 0
POSTAR