Opinião: Thread Web

6 respostas
guilherme.dio

Boa tarde,

vou desenvolver um Dashboard web, para visualização dos processos internos do setor em que me situo, mais para analise e etc.

Atualmente ja possuo um dashboard, ao qual fiz em c#, mas é aplicativo desktop, e esta atrapalhando um pouco o banco, pois muita gente usa esse dashboiard ao mesmo tempo e fica lento.

Então vou fazer este modulo web, e pensei num modo para que somente o servidor do sistema acesse o banco que disponibilia os dados para geração dos gráficos, e para isso pensei em fazer algo assim:

1 Thread carrega um(ou mais, dependendo da variadade de gráficos) objeto(s) estatico(s), no server-side, de tempo em tempo.

Os clientes que acessam, realizam um request no server dos dados deste(s) objeto(s) e carregam seus gráficos, de tempo em tempo.

Isso para evitar que os controllers acessem a toda hora o banco por cada request.

GOstaria de saber, se esta é a melhor abordagem, ou tem algum recurso que eu possa usar sem fazer a Thread(ou até mesmo um timer) que alimenta o objeto ?

Obrigado.

6 Respostas

WRYEL

EJB / TimeService faz isso com poucas linhas de código.

Não creio que a culpa seja da sua aplicação do banco ficar lento, pois, ao meu ver, não é nada excepcional sua aplicação. O que seria muita gente acessando esse dashboard pra você ?

edit: Se não puder usar EJBs, tem o Quartz também.

Luizao

Acho que isso vc resolve com caching…

guilherme.dio

WRYEL:
EJB / TimeService faz isso com poucas linhas de código.

Não creio que a culpa seja da sua aplicação do banco ficar lento, pois, ao meu ver, não é nada excepcional sua aplicação. O que seria muita gente acessando esse dashboard pra você ?

edit: Se não puder usar EJBs, tem o Quartz também.

EJB vc diz no sentido de usar o entity beans ?

Muita gente usando, digo umas 10…mas pq é o seguinte, o sistema tem atualmente 20 gráficos diferentes, no painel principal todos aparecem ao mesmo tempo, porem nesse painel eles sao atualizados a cada 3 minutos, e todos com o mesmo gerenciador de atualização…agora, é possivel abrir os graficos separadamente ao clicar em algum dos que aparecem no painel principal, ele fica em modo tela cheia(muito util pra nossa TV que fica no setor, aonde fica “trocando” as telas full screen, pra q todos possam ver os graficos), e quando esta aberto separado atualiza a cada 10 segundos, entao muita gente abre varios e esquece aberto, entao imagina alguem que abriu todos os 20 graficos ao mesmo tempo, 20 selects a cada 10 segundos no banco.

Por isso quero fazer esse modulo web e acabar com o desktop.

Também vou fazer um modulo pro android, que faz request no próprio web service pra gerar seus gráficos.

WRYEL

Quartz então resolve seu problema. Você poderia agendar uma tarefa para ir no banco de tempos em tempos para atualizar seus gráficos (poderia guardalos no contexto da sua aplicação[todos enxergam], mas duvido que esse quesíto seja a melhor abordagem, aguarde por mais opiniões). Se estiver pensando em webservices, coloque na sua lista de possiblidades o accesso a eles com REST.

edit: link para o quartz: http://quartz-scheduler.org/documentation/quartz-2.1.x/tutorials/tutorial-lesson-01

guilherme.dio

WRYEL:
guilherme.dio:

EJB vc diz no sentido de usar o entity beans ?

Muita gente usando, digo umas 10…mas pq é o seguinte, o sistema tem atualmente 20 gráficos diferentes, no painel principal todos aparecem ao mesmo tempo, porem nesse painel eles sao atualizados a cada 3 minutos, e todos com o mesmo gerenciador de atualização…agora, é possivel abrir os graficos separadamente ao clicar em algum dos que aparecem no painel principal, ele fica em modo tela cheia(muito util pra nossa TV que fica no setor, aonde fica “trocando” as telas full screen, pra q todos possam ver os graficos), e quando esta aberto separado atualiza a cada 10 segundos, entao muita gente abre varios e esquece aberto, entao imagina alguem que abriu todos os 20 graficos ao mesmo tempo, 20 selects a cada 10 segundos no banco.

Por isso quero fazer esse modulo web e acabar com o desktop.

Também vou fazer um modulo pro android, que faz request no próprio web service pra gerar seus gráficos.

Quartz então resolve seu problema. Você poderia agendar uma tarefa para ir no banco de tempos em tempos para atualizar seus gráficos (poderia guardalos no contexto da sua aplicação[todos enxergam], mas duvido que esse quesíto seja a melhor abordagem, aguarde por mais opiniões). Se estiver pensando em webservices, coloque na sua lista de possiblidades o accesso a eles com REST.

edit: link para o quartz: http://quartz-scheduler.org/documentation/quartz-2.1.x/tutorials/tutorial-lesson-01

Vi a documentação dele, é praticamente um timer né…o unico problema, é que como tenho vários tipos de gráficos que vão ser criados, a maioria difere dos dados do outro, entao eu teria mais de um objeto estatico no servidor, será que caí bem guarda-los no contexto ?

WRYEL

Eu particularmente não gosto de acessar dados de modo estático, pois cria claramente uma dependencia fortíssima entre classes. Sem contar que para fazer testes fica um saco :?

Ainda assim seria mais elegante acessar o contexto fazendo:

Map<String, SeuTipo> mapaDeGraficos = getServletContext().getAttribute(CHAVE);
synchronized (mapaDeGraficos) {
    SeuTipo seuTipo = mapaDeGraficos.get(CHAVE_DO_MAPA);
    ...
}

Mas falando de problemas reais, você pode fazer um listener (ServletContextListener) na sua aplicação que inicia esse timer. E depois, continuar com o problema normalmente, assim, eliminando a necessidade de acesso estático. Não se esqueça de sincronizar o acesso aos dados :slight_smile:

Criado 29 de maio de 2012
Ultima resposta 30 de mai. de 2012
Respostas 6
Participantes 3