Dimensionar cache de uma aplicação web

7 respostas
boaglio

É interessante numa aplicação web fazer cache de dados mais utilizados como por exemplo combos de Cidades/Estados.

A pergunta é: qual o limite disso?
Se eu tenho uma lista de 1000 valores e ela é usada constantemente sem
muitas alterações , eu posso colocar no cache como um HashMap?

Existe um limite viável para isso?

Não tenho controle sobre as configurações da aplicação (está na locaweb),
mas gostaria de saber se existe alguma regra pra isso.

7 Respostas

Mauricio_Linhares

O limite é o quanto a Locaweb deixar (e se for no ambiente compartilhado, não é muito não).

Você pode fazer o cache disso lá nos seus DAOs (ou deixar pro seu mecanismo de persistência, se for o Hibernate).

boaglio

Então, mas se eu definir um cache muito grande o que pode acontecer?

Na criação do cache levar um belo OutOfMemory?

Ou então quando o site tiver muitos acessos, posso levar um OutOfMemory?

Tenho medo que o uso abusivo de cache deixe minha aplicação rápida mas
me prejudique por outro lado. :shock:

L

Você irá implementar um framework de cache, ou irá usar qual?

Este framework deve prever este tipo de erros. No meu ponto de vista um sistema de cache não deve lançar exceções, uma vez que se der algum problema, qualquer tipo de erro na sua execução, proceda como se o elemento não estivesse em cache.

Gosto do EhCache, nunca tive problemas com ele de OutOfMemory, mas também nunca utilizei ele em ambientes compartilhados, nem serviços de hospedagem.

[]s
Lucas Balensiefer

boaglio

lucasbalensiefer:
Você irá implementar um framework de cache, ou irá usar qual?

Eu implementei um cache com alguns LinkedHashMaps.

Mauricio_Linhares

boaglio:

Então, mas se eu definir um cache muito grande o que pode acontecer?

Na criação do cache levar um belo OutOfMemory?

Se você instancia tudo “de uma vez só”, só corre o risco de levar OutOfMemoryError quando a aplicação carregar, repois não tem mais isso não (a não ser que a quantidade seja tão grande que não dê espaço pra aplicação utilizar memória).

Você não pode simplesmente usar ou não, vai ter que testar (inclusive com testes de carga mesmo) pra ver como a aplicação vai funcionar, não dá pra usar cache simplesmente por usar, especialmente se for interessante que a aplicação seja escalável, caches não são uma boa idéia para quem quer deixar aplicações escaláveis (a não ser que você use um cache distribuído, o que fica ainda mais complicado).

Se a coisa é simples, carregar todos os objetos no banco de dados e mais nada (eles só vão ser vistos e não alterados) basta carregar tudo em coleções e pronto, não precisa se preocupar muito com isso não. Agora se você quer carregar objetos “sob demanda” a coisa muda de figura e é bom pensar no Hibernate pra fazer a persistência (pelo menos desses objetos) ou usar um framework de cache como o EhCache, ele é bem simples de usar e entender, não tem mágica não :smiley:

L

Gosto do Hibernate, mas uma vez que você usa DAO, um dos motivos é a independência da camada de persistência. Amarrar o cache nesta, não acho muito legal. Acredito que fique melhor utilizar interceptors ou AOP e definir CachePoints e UncachePoints e fazer isto a nível de métodos nos serviços.

Após montar um padrão/estrutura fica fácil trabalhar assim. Fica a idéia…

[]s
Lucas Balensiefer

boaglio

Vou analisar minha aplicação e esse framework EhCache.

Valeu galera! :thumbup:

Criado 9 de maio de 2006
Ultima resposta 10 de mai. de 2006
Respostas 7
Participantes 3