Esse artigo faz parte da revista Clube Delphi Edição 61. Clique aqui para ler todos os artigos desta edição

 

Atenção: por essa edição ser muito antiga não há arquivo pdf para download desta revista. os artigos disponíveis somente em doc.

Acesso ao InterBase e Firebird

Otimize seu projeto client/server: performance, tráfego de dados, segredos e técnicas avançadas

 

Mesmo com a crescente utilização de sistemas N-Tier (multicamadas) e a popularização da Internet para sistemas Web, o desenvolvimento de aplicações client/server continua sendo um dos projetos mais comuns em Delphi para empresas de pequeno/médio porte. Acredito que muitos de vocês
desenvolvedores já possuem pelo menos uma aplicação desse tipo em produção,de forma que mostraremos neste artigo algumas dicas para utilização em aplicações client/server, acessando o banco de dados InterBase ou Firebird através de dbExpress (você pode usar o Delphi 6,7 ou 2005).

Falaremos sobre chaves-primárias, chaves-estrangeiras, índices, triggers, stored procedures, consultas parametrizadas (essenciais para esse tipo de aplicação), joins, subselects, otimização de tráfego de dados na rede e ajustes de configuração no IB/FB para aumentar
a performance. Também aproveitaremos para mostrar algumas técnicas e segredos de utilização dos componentes ActionList, ClientDataSet e DataSetProvider.

Para este exemplo, vamos criar uma aplicação client/server típica, propositalmente já com algumas falhas. Em cima dela, a seguir, aplicaremos várias otimizações, indicando técnicas avançadas e
cuidados necessários. Se você está apenas começando no mundo duas camadas, vindo de uma solução desktop (Paradox, DBF etc.), também encontrará dicas essenciais neste artigo.

Criando a aplicação de exemplo

Crie uma aplicação VCL no Delphi, adicione ao projeto um DataModule (dê o nome de "DM") e coloque um SQLConnection, um SQLDataSet (paleta dbExpress}, um DataSetProvider e um ClientDataSet (paleta Data Access). Configure o acesso dbExpress ao banco Employee.fdb (FB) ou Employee.gdb (IB),dando um duplo clique no SQLConnection e clicando em "+" para adicionar uma conexão. Aponte o caminho do banco no parâmetro Database (Figura 1).

Nota: os arquivos citados anteriormente são distribuídos juntamente com a instalação do IB/FB.

Aponte a propriedade SQLConnection do SQLDataSet para SQLConnection 1 e ajuste sua propriedade CommandText para "select * from Employee"Aponte o DotaSerdo DataSetProvider para

 

Figura 1. Criando a conexão dbExpress

SQLDataSetI eProviderNamedo ClientDataSet para DataSetProvider 1. Seu DataModule deve estar semelhante ao da Figura 2.

Dê um duplo clique no SQLDataSet e adicione os campos TFields. Ative o ClientDataSet, dê um duplo clique nele e adicione também os Tfields. Selecione todos os campos e arraste-os para o formulário.
Para facilitar, neste exemplo, construímos a interface de usuário apenas com os campos principais.

No formulário da aplicação, adicione um ImageList, um ActionList e alguns BitBtns. Inclua no ImageListal gumas imagens e faça a ligação ao ActionList (propriedade Images). Dê um duplo clique no ActionList, aperte CtrI+Ins e adicione as ações já pré-defínidas da categoria DataSete que serão usadas no exemplo (basicamente as de navegação, exclusão, gravação e Appiy). Ajuste o Captíon, Imageindex e Hint de cada ação, a seu gosto.

Para cada botão, aponte a propriedade Action para uma ação adicionada anteriormente. Note que, com isso, não precisaremos digitar nenhuma linha de código, como por exemplo, chamar os métodos
do ClientDataSet - Append, Delete, AppIyUpdates etc. Tudo é feito visualmente, graças às ações pré-definidas do ActionList.

 

 

Figura 2. DataModule da aplicação client/server

 

Seu formulário nesse momento deve estar semelhante ao mostrado na Figura 3,que é muito semelhante a uma aplicação client/server típica. Rode a aplicação, navegue pêlos registros, altere, inclua ou exclua os registros para ver se está tudo funcionando corretamente, antes de começarmos as otimizações.

 

  

 

Figura 3. Uma aplicação client/server típica

 

Observe que o ActionLis  se encarrega de habilitar/desabilitar os botões conforme a necessidade (por exemplo, desabilitar o botão de gravação se o DataSet não estiver em modo de edição). Nem mesmo
é preciso apontar as Actions para o DataSource/DataSet, o ActionList se encarrega de detectar isso automaticamente.

 

Consultas parametrizadas

 

Se sua aplicação client/server possui uma boa velocidade na obtenção e atualização de dados, então podemos dizer que ela tem performance.Se você aumentar o número de usuários conectados
e o tempo de resposta nas estações clientes continuar o mesmo, sua aplicação tem escalabilidade. No entanto, não é simples obter a melhor performance e escalabilidade sem conhecer e usar boas
técnicas de desenvolvimento client/server e SQL

Começaremos pelo básico. Não poderíamos falar em otimização client/server sem falar de parametrização de consultas.O erro mais comum em desenvolvimento client/server: "select * from tabela". Com o dbExpress, isso faz com que todos os dados da tabela sejam trazidos de uma única vez para a cache local da aplicação, o que pode fazer a abertura de uma tabela levar minutos para responder. O desenvolvedor então usava Locate e Filtros para manipular os dados localmente, após obtidos do SGBD. Para que trazer milhares de registros para a cache da aplicação, se o seu usuário vai consul-
tar/atualizar apenas um ou dois? Pergunte ao usuário antes o que ele quer ver!   

Em nosso exemplo, traremos somente um registro por vez da tabela Employee. Altere a instrução SQL do dstEmployee {CommandText} para:

 

select EMP_NO, FIRST_NAME, LAST_NAME.DEPT_NO
from EMPLOYEE where EMP_NO=:EMP_NO

 

Criamos um parâmetro (Emp_No), que deve ser configurado na propriedade Params do dstEmployee como tendo o Param Type = ptlnput (Figura 4). Dê um dique de direita no ClientDataSete escolha
FetchParams, para que possamos passar o valor para o parâmetro diretamente nesse componente.Observe que agora colocamos no select somente os campos que devem ser retornados para exibição em tela, dispensando o "*".  Já temos as duas primeiras otimizações.

Não são mais necessários os botões de navegação, então você pode excluí-los. Ao desenvolver aplicações client/server, geralmente não usaremos métodos desse tipo (fírst,next etc.), além de métodos

 

...

Quer ler esse conteúdo completo? Tenha acesso completo