Melhorar tempo de resposta (Cliente-Servidor)
Bom dia,
Gostaria da opinião dos colegas sobre um assunto que acredito que todo programador ao menos uma vez já passou por esse problema ... Possuo um sistema em Delphi rodando numa rede corporativa, ou seja, com milhares de máquinas e várias sub-redes, o meu servidor é Firebird 1.5.3 e aplicação usa componentes de acesso IBX, na realidade a concepção do sistema é simples o objetivo principal é gravar um pequeno insert na tabela principal o problema é o seguinte, que ele realiza pequenas consultas em outras tabelas, tipo : funcionário, localidade e usuários. A minha primeira idéia seria junto com aplicativo cliente, enviar uma base local com as tabelas de cadastro e o unico dado que trafegaria pela rede seria o insert na hora de gravar, mas nesse caso, eu teria um incoveniente na hora de atualizar as tabelas de cadastro. A segunda idéia seria deixar no BD principal as tabelas de cadastro e na hora que o usuário acessar o sistema ele alimentaria os dados das tabelas de cadastro em ´clientdatasets´ que ficariam na memoria e poderiam ser acessados facilmente pela aplicação, por isso eu pergunto aos colegas, qual seria a melhor alternativa ? será que idéia dos ´clientsdatasets na memoria´ é viável ? ou teriam uma outra solução para o problema ?
No aguardo,
Rogerio_Amorim
Gostaria da opinião dos colegas sobre um assunto que acredito que todo programador ao menos uma vez já passou por esse problema ... Possuo um sistema em Delphi rodando numa rede corporativa, ou seja, com milhares de máquinas e várias sub-redes, o meu servidor é Firebird 1.5.3 e aplicação usa componentes de acesso IBX, na realidade a concepção do sistema é simples o objetivo principal é gravar um pequeno insert na tabela principal o problema é o seguinte, que ele realiza pequenas consultas em outras tabelas, tipo : funcionário, localidade e usuários. A minha primeira idéia seria junto com aplicativo cliente, enviar uma base local com as tabelas de cadastro e o unico dado que trafegaria pela rede seria o insert na hora de gravar, mas nesse caso, eu teria um incoveniente na hora de atualizar as tabelas de cadastro. A segunda idéia seria deixar no BD principal as tabelas de cadastro e na hora que o usuário acessar o sistema ele alimentaria os dados das tabelas de cadastro em ´clientdatasets´ que ficariam na memoria e poderiam ser acessados facilmente pela aplicação, por isso eu pergunto aos colegas, qual seria a melhor alternativa ? será que idéia dos ´clientsdatasets na memoria´ é viável ? ou teriam uma outra solução para o problema ?
No aguardo,
Rogerio_Amorim
Rogerio_amorim
Curtidas 0
Respostas
Thomaz_prg
08/09/2006
Bom, tenho algo mais ou menos da forma como descreveu, e vou colocar como fiz e porque:
Fiz assim, as consultas, são todas feitas no BD principal, isso porque, muitas vezes, é acrescentado um novo item nas tabelas de consulta (funcionários por exemplo), e se eu utilizasse clientdataset´s, carregando os dados pra memória e utilizando, muitas vezes, eu não teria essa consulta atualizada. O que faço é, trazer a menor quantidade possível de informações e registros. Para agilizar, procurei avaliar como estavam sendo gerados os plain´s das consultas, e criei índices para agilizar isso.
Fiz assim, as consultas, são todas feitas no BD principal, isso porque, muitas vezes, é acrescentado um novo item nas tabelas de consulta (funcionários por exemplo), e se eu utilizasse clientdataset´s, carregando os dados pra memória e utilizando, muitas vezes, eu não teria essa consulta atualizada. O que faço é, trazer a menor quantidade possível de informações e registros. Para agilizar, procurei avaliar como estavam sendo gerados os plain´s das consultas, e criei índices para agilizar isso.
GOSTEI 0
Rogerio_amorim
08/09/2006
Blz Thomaz_prg,
Vou avaliar ....
Mas em relação aos clientdataset´s, se no caso as tabelas não fossem atualizadas constantemente, seria uma idéia a considerar ???
Vou avaliar ....
Mas em relação aos clientdataset´s, se no caso as tabelas não fossem atualizadas constantemente, seria uma idéia a considerar ???
GOSTEI 0
Thomaz_prg
08/09/2006
Com certeza...
pois diminuiria e muito o tráfego de dados pela rede.
pois diminuiria e muito o tráfego de dados pela rede.
GOSTEI 0
Raserafim
08/09/2006
o thomaz traduzio bem o problema do ClientDataSet e mostrou uma boa e importante solução.
devemos observar alguns detalhes:
vc deve sempre procurar trazer o mínimo de dados possível, somente o que o usuário vai utilizar naquele momento, ou seja, os dados devem ser trazidos sobre demanda [esse é o segredo].
exemplo:
na Query do seu cadastro de funcionário vc utilizaria algo semelhante a isso:
ou seja, vc passaria como parâmetro o código do funcionário que quer visualizar.
claro que o usuário não precisa passar o código. vc pode criar uma tela de pesquisa onde o usuário digita parte do nome do funcionário, clica em localizar, e uma lista é exibida (com apenas o nome do funcionário e o código [para diminuir o tráfego de informações]) . basta o usuário dar, por exemplo, dois cliques no registro e vc passa o código, do registro que o usuário escolheu, como parâmetro para a query funcionários.
seu sistema estará bem planejado para rede quando vc não tiver mais aqueles botões de navegação nos registros [claro que não estou me referindo aos botões em si, mas sim ao fato de que se vc tem estes botões é pq está trazendo todos os registros para o usuário navegar].
desta forma seu ganho de desempenho será extraordinário.
devemos observar alguns detalhes:
vc deve sempre procurar trazer o mínimo de dados possível, somente o que o usuário vai utilizar naquele momento, ou seja, os dados devem ser trazidos sobre demanda [esse é o segredo].
exemplo:
na Query do seu cadastro de funcionário vc utilizaria algo semelhante a isso:
select * from FUNCIONARIOS where COD_FUNCIONARIO = :Cod_Funcionario
ou seja, vc passaria como parâmetro o código do funcionário que quer visualizar.
claro que o usuário não precisa passar o código. vc pode criar uma tela de pesquisa onde o usuário digita parte do nome do funcionário, clica em localizar, e uma lista é exibida (com apenas o nome do funcionário e o código [para diminuir o tráfego de informações]) . basta o usuário dar, por exemplo, dois cliques no registro e vc passa o código, do registro que o usuário escolheu, como parâmetro para a query funcionários.
seu sistema estará bem planejado para rede quando vc não tiver mais aqueles botões de navegação nos registros [claro que não estou me referindo aos botões em si, mas sim ao fato de que se vc tem estes botões é pq está trazendo todos os registros para o usuário navegar].
desta forma seu ganho de desempenho será extraordinário.
GOSTEI 0
Raserafim
08/09/2006
mas vc pode ir ainda além.
o ClientDataSet é muito interessante e deve ser explorado.
não para armazenar todos os dados, pois cairemos no problema como o thomaz explicou, mas para que ao trazer vários e inevitáveis registros, por exemplo, ítens de uma venda, o usuário possa navegar entre os ítens, para frente e para tráz, sem que a rede seja utilizada, pois o ClientDataSet ao pegar os dados da base, fecha a query e deixa os dados apenas em memória, o que já traz mais um benefício: ao fechar a query, fecha assim a conexão desafogando a rede.
além de várias outras facilidades e benefícios, ..., além de reduzir o tempo necessário para uma transação, ..., etc.
o ClientDataSet é muito interessante e deve ser explorado.
não para armazenar todos os dados, pois cairemos no problema como o thomaz explicou, mas para que ao trazer vários e inevitáveis registros, por exemplo, ítens de uma venda, o usuário possa navegar entre os ítens, para frente e para tráz, sem que a rede seja utilizada, pois o ClientDataSet ao pegar os dados da base, fecha a query e deixa os dados apenas em memória, o que já traz mais um benefício: ao fechar a query, fecha assim a conexão desafogando a rede.
além de várias outras facilidades e benefícios, ..., além de reduzir o tempo necessário para uma transação, ..., etc.
GOSTEI 0
Raserafim
08/09/2006
agora gostaria que algém fosse ainda mais além :)
GOSTEI 0
Rogerio_amorim
08/09/2006
Estou implementando em meu sistema o uso de Clientdataset´s p/ armazenar em memoria as tabelas que eu chamo de tabelas estáticas, ou seja, elas são de vital importância para o funcionamento do sistema mas a sua atualização não ocorrem com frequência, portanto, acredito que trazendo apenas as informações necessárias para a aplicação cliente em conjunto com a otimização de índices e armazenando esses dados em memoria com os Clientdataset´s seria uma boa alternativa. Estou realizando alguns testes e pretendo postar mais informações futuramente.
Como disse o colega raserafim se alguem tiver mais informações, porfavor, vamos debater ...
Rogerio_Amorim
Como disse o colega raserafim se alguem tiver mais informações, porfavor, vamos debater ...
Rogerio_Amorim
GOSTEI 0