Design Patterns J2EE - Value List Handler
----------------------------------------
Nome
--------------
Value List Handler
Outros nomes
--------------
Page By Page Iterator
Contexto
--------------
Clientes frequentemente precisam recuperar grande massa de informações para
formatação de relatórios na camada de apresentação.
Problema
--------------
- O alto custo do uso de métodos finders em entity beans não justifica
sua utilização para a recuperação para leitura de grande quantidade de informações.
- Para o cliente, é muito difícil absorver toda a massa de dados recuperados
de uma só vez, fazendo necessária a utilização de algum mecanismo de paginação do resultado da consulta.
Solução
--------------
Implementar um mecanismo para a recuperação de informações que não utilize
entity beans e que mantenha um cache do resultado para que os dados possam
ser fornecidos ao cliente de acordo com sua demanda.
Consequências
--------------
+ Melhora de performance: . o uso de entity beans para recuperar N registros envolve N+1 consultas SQL (1 para o findByAlgumaCoisa e outras N para popular cada bean que for encontrado). O uso de um mecanismo direto pode reduzir esta quantidade a apenas 1 query, independente da quantidade de registros encontrados.
. A possiblidade de implementação de um cache evita a necessidade de realização de uma nova query a cada transição entre páginas.
Estratégias
--------------
Criar um session bean statefull que implemente uma interface Iterator e, com o auxílio de DAOs (próximo pattern), acesse a camada de persistência, recupere as informações desejadas e mantenha estas informações em cache
para fornecer ao cliente segundo sua demanda.
/**
* Interface com serviços para a navegação no resultado
* @author alegomes
*/
public interface ValueListIterator
{
/**
* Navega para a proxima pagina
*/ public Collection next(int qtd);
/**
* Navega para a pagina anterior
*/ public Collection previous(int qtd);
/**
* Recupera o elemento corrente, que e a referencia para a * transicao entre paginas
*/ public ValueObject getCurrent();
/**
* Reinicializa o elemento corrente para o primeiro elemento da lista
*/ public void reset();
/**
* Retorna a quantidade de elementos disponiveis
*/ public int size();
}
/**
* VaueListHandle: Statefull session bean que implementa a interface * ValueListIterator
* @author alegomes
*/
class ValueListHandler implements ValueListIterator, SessionBean
{
private Vector cache;
//Indice para o elemento corrente. Ele é a referencia para a //transicao entre paginas. private int idxCurr;
//Indice para o ultimo elemento disponivel
private int idxLast;
public void ejbCreate()
{
cache = new Vector();
//Nao vem ao caso por enquanto, mas o proximo passo aqui
//seria a recuperacao das informacoes e o respectivo armazenamento
//no cache.
//Logo, teriamos uma serie de cache.add(elemento);
cache.trimToSize() idxCurr = 0; idxLast = cache.size();
}
//Outros metodos ejb*
//Inicio da implementacao da interface ValueListIterator
public Collection next(int qtd)
{
Vector page = new Vector();
while ((idxCurr < idxLast) && (qtd > 0))
{
page.add(cache.elementAt(idxCurr));
idxCurr++;
qtd--;
}
page.trimToSize();
return page;
}
public Collection previous(int qtd)
{
Vector page = new Vector();
while (idxCurr > 0 && qtd > 0)
{
idxCurr--;
page.add(cache.elementAt(idxCurr));
qtd--;
}
}
public ValueObject getCurrent()
{
return (ValueObject)cache.elementAt(idxCurr);
}
public void reset()
{
idxCurr = 0;
}
public int size()
{
return idxLast;
} }
Próximo design pattern J2EE: Data Access Object
Bons patterns !!!
Alexandre Gomes
Sou Jedi, Sou Java!
================================================================================
[dicas-list] circula diariamente com pequenas dicas sobre a plataforma Java e é
mais um serviço da Sociedade de Usuários Java - http://www.soujava.org.br
*** SouJava - Fortalecendo a Comunidade Java Brasileira! ***
- Para contribuir com uma dica, envie um e-mail para [EMAIL PROTECTED]
- Participe de outras listas de discussão sobre a linguagem Java.
Saiba mais em http://www.soujava.org.br/lista.htm
--------------------------------------------------------------------------------
- Para assinar este boletim: mailto:[EMAIL PROTECTED]
- Para cancelar sua assinatura: mailto:[EMAIL PROTECTED]
- Dicas anteriores: http://www.mail-archive.com/dicas-list%40soujava.org.br
- Para discutir sobre as dicas, acesse o Mundo OO (http://www.mundooo.com.br)