Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Paulo do Brasil

Executar query apenas no servidor

Recommended Posts

Olá pessoal...Seguinte... é possível na aplicação, em um componente Query (TQuery BDE por ODBC ou ZReadOnlyQuery do Zeos) fazer com que a consulta seja feita no servidor (não trafegando os dados todos da tabela na rede, mas apenas o resultado, tal como uma aplicação Web)?Motivo:Todas as consultas feitas via web (intranet ou internet) são feitas solicitando informações via formulários ou links nas páginas; as informações são processadas pelo serviço no servidor (uma aplicação cgi ou isapi no IIS ou no Apache) apenas, enviando o resultado para o cliente, que recebe uma tabela ou página no IExplorer ou Firerox em seu computador...Então, deparo com esta situação:Em um computador comum (um Pentium133mmx), se um operador abre uma página na internet (ou intranet) e pede para ver a ficha de um produto, dentre 18000 no cadastro, fornecendo seu código EAN (código de barras), a consulta leva menos de um segundo para ser executada no servidor e o operador recebe a resposta em uns... dois ou três segundos (tempo da sua máquina "formar" a página no seu navegador)...Se o mesmo operador abrir a aplicação local (Delphi6) e faz a mesma solicitação, se for a primeira consulta que ele estiver fazendo depois de iniciar o programa, a consulta vai levar uns 25 a 30 segundos para ser executada... ou seja, o componente Query está pegando toda a tabela de produtos pela rede para descobrir que só um registro atende ao pedido e selecioná-lo... Depois da primeira consulta, as próximas são mais rápidas... de 5 a 8 segundos... o operador só não pode fechar a aplicação... Aí vai então a pergunta... é possível fazer com que um componente Query que acessa uma tabela do MySQL "diga" ao MySQL lá no servidor que é ele que tem que executar a query e devolver apenas o resultado pela rede? ou configurar isso no próprio MySQL no servidor, "dizendo" a ele que será o responsável por executar todas as queries solicitadas?Grato por qualquer ajuda!!!Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Saudações Paulo,Bem, como solução para centralizar o processamento em um servidor que você possa ter mais processamento e memória garantidos, eu recomendo você fazer uma aplicação multi-camadas utilizando webservices, preferencialmente protocolo SOAP (transporte de informação será feito via XML).Dessa forma, você centraliza a parte pesada, cálculos, filtros, queries e tudo mais no servidor. Assim poderia ter o front-end, o cliente, da forma que quiser... seja uma aplicação baseada em Windows Forms (o que o Delphi chama de VCL / Win32) ou uma página web, por exemplo utilizando ASP.NET.Eu já trabalhei um bom tempo com o Zeos em Delphi7 e Delphi2006, e eu creio que você está enganado ao achar que o componente recebe a tabela inteira e trabalha o filtro em memória.Todo o trabalho de parse da query e análise de dados é feito pelo MySQL mesmo, assim como qualquer outro SGBD.Eu só imagino essa situação que você falou num caso de você colar o componente no form, já estabelecer a conexao com a tabela, pedir pra ele trazer os dados e então atribuir o filtro. Aí sim haverá uma perda totalmente desnecessaria de desempenho.Eis o que lhe sugiro (criando o componente dinamicamente):procedure BuscarDadosCliente(nome: string);var ZQuery: TZReadOnlyQuery;begin ZQuery := TZReadOnlyQuery.Create(Self); ZQuery.Connection := (seu_componente_zconnection); ZQuery.Close; // Garantia pra poder alterar o SQL Text, senão pode ocorrer erro em runtime ZQuery.SQL.Text := 'SELECT id, nome, telefone FROM clientes WHERE nome = ' + QuotedStr(nome); try try ZQuery.Open; // daqui pra frente coloque mais coisas que pretende fazer... se for uma função ao invés de procedure, lembre-se // de devolver o resultado nesse pedaço except ShowMessage("Deu erro!"); // ou qualquer outro tratamento end; finally FreeAndNil(ZQuery); // extremamente importante liberar da memoria e destruir os componentes criados dinamicamente end;end;Bem, peço desculpas se apareceu algum errinho bobo aí nesse código, mas estou sem Delphi instalado nessa máquina q estou usando agora, de modo que escrevi esse código "de cabeça", mas acho q é o que você procura.Espero ter ajudado,

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.