HashLoad / horse

Fast, opinionated, minimalist web framework for Delphi
MIT License
1.17k stars 217 forks source link

Problema com LifeCycle - Multithread #246

Closed gleikocarmelo closed 2 years ago

gleikocarmelo commented 2 years ago

Vou expor meu cenário para ficar mais fácil o entendimento. Recentemente migrei meus projetos para o Horse, anteriormente utilizava DataSnap. No DataSnap, dentro do ServerMetods tenho um FireConnection conectado ao meu banco principal e os seguintes métodos: -- GetIdCliente - Banco Principal. (Consulta: Select id FROM tabclientes) -- GetListaProdutos - Cada Cliente tem seu Banco. (na consulta coloco Use "NomeBancoCliente" e faço a consulta dos produtos) Na migração para o Horse, criei um DataModule e passei o FireConnection para ele e com isso passou a não funcionar igual no DataSnap, se eu fazer a requisição GetListaProdutos e depois for fazer a GetIdCliente fala que não existe essa tabela no Banco, porque o FireConnection continua setado no Banco do Cliente. Ou seja o Horse não Cria uma nova instancia para cada requisição automaticamente.

viniciussanchez commented 2 years ago

Não é o Horse que cria seu DataModule, quem tem que criar / destruir é você. Você vai ter um

procedure DoRequest(Req: THorseRequest; Res: THorseResponse; Next: TProc);
begin

end;

o que você faz dentro do begin e do end é coisa sua. Para cada requisição o horse cria uma thread. Se compartilhar memória dentro desse begin e do end, vai ter problema

gleikocarmelo commented 2 years ago

Para trabalhar com DataModule então o q vc sugere? Dentro de cada requisição devo criar e destruir o DataModule, ou existe uma melhor forma de fazer?

viniciussanchez commented 2 years ago

Essa é a melhor forma, uma requisição não deve compartilhar memória com outra, se não da acesso ao mesmo tempo e da ruim. Isso não só com Horse....

gleikocarmelo commented 2 years ago

Tenho uns 15 métodos, existe uma forma de fazer o create e o destroy do DM automaticamente toda vez que for feita uma nova requisição ou tenho que fazer isso em cada método separadamente?

viniciussanchez commented 2 years ago

https://github.com/viniciussanchez/embarcadero-conference/blob/master/2020/backend/src/controllers/Controllers.Product.pas

viniciussanchez commented 2 years ago

Podemos encerrar essa issue?

gleikocarmelo commented 2 years ago

Podemos sim, gostaria de deixar um vídeo muito bom de como resolver esse problema de uma forma bem simples. https://www.youtube.com/watch?v=Mda4A1ShrdY&list=PLjxkIzEMU_eil2a7-CpdUoNeuSnANM34y&index=6