Fórum Consulta DataSnap com Paralelismo XE7 #498990
24/10/2014
0
Ultimamente tenho realizado diversos testes de desempenho utilizando a tecnologia DATASNAP e servidores localizados no Brasil, Canadá e França.
Como resultado pude observar que o fator determinante de desempenho das aplicações está muito relacionado com a qualidade da conexão do usuário, a que chamamos de "última milha". Ou seja, quando o trecho de conexão "última milha" é bom a localização do servidor não impacta muito a experiência do usuário utilizando a aplicação.
Para resolver esse problema pensei em utilizar técnicas de paralelismo nas consultas Datasnap.
Paralelismo??? A ideia seria executar as consultas em paralelo conforme o trecho a seguir:
procedure TDM.Q1AfterScroll(DataSet: TDataSet);
var
task: array of ITask;
begin
SetLength(task,3);
task[0]:= TTask.Create (procedure ()
Begin
Q2.Close;
Q2.Params.ParamByName('P1').Value:=Q1F1.Value;
Q2.Params.ParamByName('P2').Value:=Q1F2.Value;
Q2.Open;
End);
task[0].Start;
task[1]:= TTask.Create (procedure ()
Begin
// Q3.RemoteServer:=DSPConnection3 Tentei utilizar outra conexão mas não funcionou;
Q3.Close;
Q3.Params.ParamByName('P1').Value:=Q1F1.Value;
Q3.Params.ParamByName('P2').Value:=Q2F2.Value;
Q3.Open;
End);
task[1].Start;
task[2]:= TTask.Create (procedure ()
Begin
// Q4.RemoteServer:=DSPConnection4 Tentei utilizar outra conexão mas não funcionou.
Q4.Close;
Q4.Params.ParamByName('P1').Value:=Q1F1.Value;
Q4.Params.ParamByName('P2').Value:=Q2F2.Value;
Q4.Open;
End);
task[2].Start;
TTask.WaitForAll(task);
end;
Eu sei que existem outras técnicas no Datasnap para "encapsular" varias consultas mas gostaria de experimentar o paralelismo.
Infelizmente não funcionou. Fiz até mesmo diversas modificações no código utilizando conexões individuais para cada consulta utilizando no servidor serviços individuais, com portas separadas, para cada conexão do cliente.
Faltou apenas desativar os filtros de segurança da conexão datasnap mas acredito que o problema não está relacionado com eles.
Então seguem as perguntas:
Existe algo na arquitetura do DataSnap que inviabilize esse tipo de paralelismo?
O que é necessário fazer para que o trecho de programa acima funcione?
abraço para todos
Marcelo Carvalho
Curtir tópico
+ 0Post mais votado
08/03/2016
Executando com uma rotina chamada ExecuteWithDialog(Self) todas rodam ao mesmo tempo. Vale ressaltar que não rodam isoladas, neste caso, deve-se criar uma Connection para cada Thread.
Att.
Artur Barth
Artur Barth
Gostei + 2
Mais Posts
24/10/2014
Marcelo Carvalho
Gostei + 0
24/10/2014
Raylan Zibel
Gostei + 0
24/10/2014
Marcelo Carvalho
Sim.
A classe TTASK ( System.Threading.TTask) implementa Threading.
Gostei + 0
04/11/2014
Claudio Ferreira
Gostei + 0
04/11/2014
Marcelo Carvalho
O programa apresentou funcionamento anormal. Funcionou apresentando algumas informações e travou.
Modifiquei o programa e tentei utilizar três TFDconnection um para cada FDQuery. Também não funcionou.
Posteriormente, no servidor, recompilei três versões do módulo server com portas diferentes uma para cada TFDconnection. Também não funcionou.
Estava utilizando filtros de criptografia que eu não desativei. Acredito que isso não foi a causa do problema pois nas últimas tentativas utilizei três programas no server em portas diferentes.
Ainda acredito que esta técnica pode funcionar e reduzir o tempo de transferência das informações.
Gostei + 0
05/11/2014
Claudio Ferreira
Penso que a implementação de Threads para o Windows ainda não está madura o suficiente para uso. Quando digo madura é que seja de fácil implementação sem que se possa incorrer numa série de problemas difíceis de identificar e de corrigir. Por exemplo ao olhar o seu código não vejo erro algum de implementação, deveria funcionar, mas simplesmente algumas coisas que colocamos em threads não funcionam muito bem.
Gostei + 0
05/11/2014
Marcelo Carvalho
Entendo que vale a pena insistir.
Vou encaminhar e-mails para alguns conhecidos e quando obtiver uma resposta compartilharei.
Gostei + 0
28/05/2015
Sanderson Torres
Gostei + 0
28/05/2015
Sanderson Torres
Gostei + 0
26/02/2016
Carlos Modesto
Gostei + 0
17/05/2016
Marcelo Carvalho
Resposta: São parâmetros passados para consulta executada dentro da TTASK.
No exemplo Servem apenas para simular os parâmetros de uma consulta qualquer em uma tabela.
Gostei + 0
17/05/2016
Marcelo Carvalho
Pode compartilhar um exemplo do código utilizando a solução que você encontrou?
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)