2.3.3 Page-by-Page Iterator

Anuncio
2.3.3 Page-by-Page Iterator
Page-by-Page Iterator (1)
n
Intención
n
n
También conocido como
n
n
Acceder a una lista grande de Value Objects de una manera
eficiente
Value List Handler
Motivación
n
En MiniBank necesitamos recuperar los datos de todas las cuentas
de un usuario y los de las operaciones realizadas a una cuenta
entre dos fechas
<<Interface>>
AccountFacadeDelegate
+ createAccount(accountVO : AccountVO) : AccountVO
+ findAccount(accountIdentifier : Long) : AccountVO
+ addToAccount(accountIdentifier : Long, amount : double) : void
+ withdrawFromAccount(accountIdentifier : Long, amont : double) : void
+ findAccountsByUserIdentifier(userIdentifier : Long, startIndex : int, count : int) : Collection
+ removeAccount(accountIdentifier : Long) : void
+ transfer(sourceAccountIdentifier : Long, destinationAccountIdentifier : Long, amount : double) : void
+ findAccountOperationsByDate(accountIdentifier : Long, startDate : Calendar, endDate : Calendar, startIndex : int, count : int) : Collection
Page-by-Page Iterator (2)
n
Aplicabilidad
n
n
n
n
El usuario está interesado en visualizar la lista de Value
Objects en trozos, pudiendo ir hacia adelante o atrás
La lista completa no cabría en la pantalla
La lista completa no cabría en memoria
Estructura
PageByPageIterator
n
BusinessDelegate/
SessionFacade
DAO
Participantes
n
PageByPageIterator
n
n
Puede ser una clase que implementa un interfaz con
operaciones setCursor(int), setPageSize(int),
getCurrentList(), hasNext(), etc.
Normalmente es cualquier clase que invoque repetidamente
una operación findXXX(startIndex, count, ...)
Page-by-Page Iterator (3)
n
Participantes (cont)
n
BusinessDelegate/SessionFacade
(PlainAccountFacadeDelegate) y DAO
(SQLAccountDAO y SQLAccountOperationDAO)
n
n
Colaboraciones
n
n
Proporcionan acceso a la lista de VOs
El PageByPageIterator lleva la cuenta de la posición actual
del cliente, permitiendo obtener el siguiente trozo hacia
delante o atrás por medio del
BussinessDelegate/SessionFacade
Consecuencias
n
Beneficios
n
n
Se accede a la lista eficientemente
Riesgos
n
Las inserciones y borrados que se hagan a la lista (en la fuente
de datos) mientras un cliente accede a ella, pueden provocar
que éste no vea uno de los elementos o lo vea más de una vez
Page-by-Page Iterator (4)
n
Implementación
n
n
Las conexiones a la fuente de datos se deben cerrar después
de cada acceso a un trozo de la lista
¿ Cómo posicionarse en una fila de un
java.sql.ResultSet ?
n
n
Hasta JDBC 2.0 la única manera portable es llamando “n” veces
a ResultSet.next
Si el driver soporta JDBC 2.0 o superior, existe una alternativa
más eficiente: ResultSet.absolute (scrollable result sets)
n
n
Es la opción usada en MiniBank
Código de ejemplo
n
Véanse
es.udc.fbellas.j2ee.minibank.model.account.d
ao.AbstractSQLAcountDAO.findByUserIdentifier
y
es.udc.fbellas.j2ee.minibank.model.accountop
eration.dao.AbstractSQLAcountOperationDAO.fi
ndByDate en MiniBank
Page-by-Page Iterator (y 5)
n
Patrones relacionados
n
n
n
Iterator
Data Access Object
Value Object
Descargar