Tenho um aplicação web que após setar os valores recuperados executar na query, os envia para a pagina jsp. A página exibe o conteúdo da query com a utilizando JSTL.
No entanto, esse relatório possui 2 caracteristica:
1- exibição dos dados da query;
2- impressão que exibe o conteúdo com uma formatação um pouco diferente, em preto e branco.
Meu problema é que quando o relatório é exibido, ele executa a query, seta os valores no objeto e envia para página. O mesmo acontece no relatório de impressão.
Alguns deste relatório, possuem query um pouco demoradas. Em torno de 10 à 15 minutos.
Gostaria de saber como posso criar um sistema de cache para que o relátorio de impressão não precise executar a query novamente, uma vez que ela já foi executada anteriormente.
Claro que esse sistema teria que trata cada usuário como uma sessão diferente, utilizando concorrencia para que os dados exibidos não tenham problemas de incosistenncia.
Obrigado…
Como faço cache de objetos para aplicações web?
10 Respostas
faz a busca apenas uma vez e coloca os resultados na sessao. Depois é só pegar ela aonde vc quiser… naum precisa buscar de novo no banco…
o loco hein???
Na sessão fica bem complicado…
1- a sessão inspira após um determinado tempo;
2- colocar um objeto que armazena entre 1000 e 10000 registros do banco de dados na sessão é loucura…
Bom, tem algumas apis para cache, ehcache, por exemplo. Eu geralmente uso Hibernate, que ja cuida disso para mim.
Dizem que nesse caso o hibernate é bastante eficiente.
Conheço pessoas que dizem que o cache dele não é muito bom, por isso utilizam altenativas como o C3PO.
No meu caso, quero codificar mesmo.
Deixa ver se eu entendi certo o seu problema: Você tem uma funcionalidade onde o cara faz uma escolha de filtros, submete. O seu sistema busca os dados e retorna através de objetos os dados para o jsp que os apresenta.
Dentro desta página você tem a opção de imprimir, que nada mais é que a tela com um layout diferente.
Bem, ao meu ver eu poderia resolver o seu problema de várias formas, sem ir denovo na query:
1- usando javascript
2- “Cacheando os objetos”
Por javascript, eu pegaria o conteudo da div onde os dados foram impressos, chamaria um popup e colocaria numa div desse popup com outra formatação. Isso atende e fica bem elegante. O código é bem simples e posso te passar depois
Cacheando o objeto, você tem um gama de soluções:
- colocar os dados na sessão do usuário (não recomendo, vc pode esquecer de tirar os dados de lá )
- recolocar no request quando carregar a página
- usar uma api de cache
- colocar os dados no contexto da aplicação(somente em ultima instancia e se os dados são os mesmo para todos os usuario que acessarem a aplicação)
- …
Colocar os dados na sessão é interessante pois ele fica lá disponivel. A questão é que expira junto com a sessão do usuario ou seja: quando o usuario sair ou a sessão terminar, os dados que estavam nela se perdem. Outro problema é que colocar os dados na sessão implica no cuidado de tirá-los depois, coisa que quase todo mundo esquece e acaba “poluindo”.
Colocar os dados no contexto da aplicação é quase a mesma coisa de colocar na sessão. A diferença que o dado ali perdura por todo ciclo de vida da aplicação. Mas os cuidados são os mesmos.
finalizando, acho que a melhor coisa é usar uma api de cache ou até mesmo pensar na possibilidade de usar um Hibernate que mascara bem este cache tornando bem fácil o seu uso.
Espero ter te ajudado
A minha ideia era criar uma classe que faria o papel da api de cache.
Li em uma materia da revista Java Magazine algo relacionado a esse assunto.
Baixei os fonte, mas não consegui fazer com que a classe guardasse o objeto em cache.
Claro que a estrutura era bastante interessante. Tinha inclusive metodos que utilizavam threads.
Paradiso,
Talvez o seu grande problema seja a demora para realizar a consulta e não o recurso de cache.
Antes de pensar em cache, seria melhor você otimizar a sua query, há algumas práticas que fazem maravilha nos tempos de resposta.
Verifique se as tabelas estão bem realcionadas, evite clausula in, traga somente as colunas necessárias, etc.
Também concordo que você deve tentar diminuir esse tempo primeiro, cache não seria seu principal problema aí, você disse que são 10mil registros. Olha, demorar 10 a 15 min para trazer 10 mil registros, tem alguma coisa errada.
Aí depois, você pensa em ‘cachear’ a coleção, onde você pode até usar AOP para isso. Fica muito transparente.
http://www.aspectprogrammer.org/blogs/adrian/2004/06/implementing_ca.html
Lendo esse artigo já dá pra brincar de cache:
Na sessão fica bem complicado…
1- a sessão inspira após um determinado tempo;
Tá legal que eu nao sou professor de português, ou coisa do tipo.
Mas essa nao vai passar! hehehe
A sessão EXPIRA! ehehhe