sexta-feira, agosto 20, 2004

Mini Web cache

Mini Web cache
Hoje precisei implementar um Web cache. - falando assim até parece que foi algo extraordinário. Algo bem simples, mas tá funcionando. Um dos clientes pediu essa implementação, pois a performance de acesso ao seu Web services não estava lá essas coisas....
Como eu já disse, foi algo simples. Uma classe com um atributo hash estático e privado que funciona como meu cache. Implementei dois métodos de acesso a essa hash, um add e um get. O primeiro insere um objeto no cache, e o segundo lê um objeto do cache.Agora estou trabalhando num mecanismo para limpar os objetos que não serão mais usados - senão, haja memória. Ainda não sei muito bem como será, mas imagino em criar um thread que de tempos em tempos leia e remove os objetos sem utilidade.

O código ficou mais ou menos assim:

public class SessionCache
{
private static Hashtable globalCache = new Hashtable();

/**
* <p>Insere um objeto no cache do usuário.
*/
public static void add(String name, Object value)
{
String sessionId = RequestCtx.getUserId().toString() +
RequestCtx.getAccountId().toString() +
RequestCtx.getResponsibilityId().toString() +
ServletSessionManager.getIcxSessionTicket();

Hashtable uc = (Hashtable)globalCache.get(sessionId);
if (uc == null)
uc = new Hashtable();
uc.put(name, value);
globalCache.put(sessionId,uc);
}

/**
* <p>Pega um objeto do cache ou null se o objeto não existir.
*/
public static Object get(String name)
{
Object value = null;
String sessionId = RequestCtx.getUserId().toString() +
RequestCtx.getAccountId().toString() +
RequestCtx.getResponsibilityId().toString() +
ServletSessionManager.getIcxSessionTicket();
Hashtable uc = (Hashtable)globalCache.get(sessionId);
if (uc != null)
value = uc.get(name);

return value;
}
}