[firebase-br] 3 camada com firebird 2.1

Sandro Souza escovadordebits em gmail.com
Seg Dez 15 16:15:44 -03 2008


Bom dia/tarde Paulo.

Cada TRemoteDataModule representa uma conexão independente com o banco de
dados, e sendo assim, em cada um, você deveria colocar um TIBODatabase,
TIBOTransaction e as respectivas TIBOQueries para que cada TRemoteDataModule
possa ter a sua própria conexão independente.

Além disso, existe um pequeno bug de implementação nas classes básicas de
acesso a banco de dados no Delphi, ou seja, erros conceituais, e
consequentemente, de implementação na própria unidade DB.pas que vem no
Delphi.

Trocando em miúdos, a unidade DB.pas não foi feita prevendo o acesso
simultâneo (em threads) a um ou mais bancos de dados, e consequentemente,
você vai obter muitas violações de acesso quando o fluxo de requisições
aumentar (vários usuários solicitando operações) e outros TRemoteDataModules
forem instanciados automaticamente, cada um tentando deles tentando executar
uma operação de banco de dados ao mesmo tempo.

Para evitar isso, crie um novo projeto servidor, e quando acrescentar o
TRemoteDataModule, vai aparecer uma janela solicitando o perfil dos
RemoteDataModules de sua aplicação servidora.

Nessa janela, o método de instanciamento já vem, por padrão, em "Multiple
Instance", ou seja, múltiplas instâncias. Dessa forma, cada aplicação
cliente conectada cria uma outra instância do seu TRemoteDataModule com sua
conexão própria. E vai causar essas violações de acesso quando as operações
de banco de dados forem executadas ao mesmo tempo.

Altere esse método de instanciamento para "Single Instance", o que fará com
que, para cada aplicação cliente conectada, seja executada uma nova
instância da aplicação servidora (relação de um para um), e sendo assim,
cada aplicação servidora conterá apenas uma única instância do seu
TRemoteDataModule. Isso evitará o problema das violações de acesso, ao custo
de consumir mais recursos da máquina, mas infelizmente é o que você pode
fazer se for apenas utilizar o que já vem no Delphi.

Como o seu projeto de aplicação servidora, muito provavelmente, já está
criada e funcionando, então faça o seguinte:

1 - Edite a unidade do seu respectivo TRemoteDataModule.

2 - Vá para a seção de inicialização (initialization) da unidade (no fim do
código fonte).

3 - No comando de criação da instância da "fábrica de componentes", altere o
quarto parâmetro de "ciMultiInstance" para "ciSingleInstance", ou seja, em:

TComponentFactory.Create(ComServer, TSeuRemoteDataModule,
Class_SeuRemoteDataModule, *ciMultiInstance*, tmApartment);

ficaria assim:

TComponentFactory.Create(ComServer, TSeuRemoteDataModule,
Class_SeuRemoteDataModule, *ciSingleInstance*, tmApartment);

Resumindo:

1 - Método "Multiple Instance"

1.1 - Instâncias de executável servidor por conexão

Uma única para todas as conexões.

1.2 - Instâncias de TRemoteDataModule por conexão

Uma instância para cada conexão (cada uma com sua conexão independente).

1.3 - Prós

Consome menos recursos da máquina.

1.4 - Contras

Causa violações de acesso quando coincide uma ou mais operações de banco de
dados ao mesmo tempo (um Open de uma query em um uma instância do seu
TRemoteDataModule com um Next de outra query em outra instância do seu
TRemoteDataModule, por exemplo).

2 - Método "Single Instance"

2.1 - Instâncias de executável servidor por conexão

Uma instância para cada conexão.

1.2 - Instâncias de TRemoteDataModule por conexão

Uma única instância.

1.3 - Prós

Evita as violações de acesso quando uma ou mais operações de banco de dados
são executadas ao mesmo tempo, já que estão sendo executadas em aplicações
separadas.

1.4 - Contras

Consome mais recursos da máquina, já que tratam-se de instâncias completas
da mesma aplicação.

Espero ter te ajudado mais que atrapalhado.

2008/12/15 Paulo Sérgo Feix <paulinhofeix em gmail.com>

> Boa tarde
>
> Alguém pode me ajudar, programação em 3 camada com firebird 2.1, componente
> IBO.
>
> a pergunta é o seguinte, RemoteDataModule tenho o IBOQuery, e no formo de
> tenho IBODatabase1, IBOTransaction1, esta coreto assim, isto no lado
> servidor
>
> --
> Paulinho Sérgio Feix
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista