You are on page 1of 21

Estrategias de fetch

Sistemas de persistencia de
objetos
Fetch
 Forma de recuperar objetos de la BDD y
meterlos en contexto de persistencia
 En memoria los objetos forman un grafo
por sus asociaciones
 Recorrer el grafo (navegar las
asociaciones) es la forma natural de los
modelos Orientados a Objetos
 Pero ¿cuándo y cómo se cargan en
memoria?
nov-08 Alberto M.F.A. alb@uniovi.es 2
Estrategia de fetch
 ¿Cuándo se suben de la BDD?
 Los objetos asociados con un objeto dado
 Dos momentos:
 LAZY: se cargan en el momento que se
necesiten
 EAGER: se cargan al cargar el objeto que
las asocia

nov-08 Alberto M.F.A. alb@uniovi.es 3


Estrategias de fetch
 ¿Cómo se cargan? (los asociados)
 Ya sea LAZY o EAGER, en el momento que
se decide cargarlos ¿cómo?
 Varios tipos:
 Batch prefetch
 Subselect  Ajustes Hibernate
 Eager JOIN
 Eager Select
nov-08 Alberto M.F.A. alb@uniovi.es 4
Lazy load con proxies

 Es un proxy
 No se ha hecho
select a la BDD

¡ No selects !
nov-08 Alberto M.F.A. alb@uniovi.es 5
Lazy load de asociaciones

 Las asociaciones son


proxies
 -ToOne: Se cargan al
refenrenciarlos
 -ToMany: Al acceder
a cualquier método
de la colección
nov-08 Alberto M.F.A. alb@uniovi.es 6
Configuración lazy:
posibilidades
 En JPA por defecto:
 LAZY: asociaciones –ToMany
 EAGER: asociaciones –ToOne
 Posibilidades:
 Desactivar lazy para la clase
 Todas las cargas de esa clase serán siempre eager
 Ajuste demasiado grueso
 -ToOne lazy
 -ToMany eager

nov-08 Alberto M.F.A. alb@uniovi.es 7


Desactivar la carga lazy de
una clase

Ya no carga proxy
Al cargar el Item se cargan
todos los usuarios relacionados
por cualquier asociación

nov-08 Alberto M.F.A. alb@uniovi.es 8


Carga eager

nov-08 Alberto M.F.A. alb@uniovi.es 9


¿Cómo cargar las
asociaciones?

Poco eficiente,
el problema de las
n+1 consultas

nov-08 Alberto M.F.A. alb@uniovi.es 10


Prefetch en lotes
 Ajuste: tamaño del lote
 Cuando se necesite hacer carga se suben
en lotes de hasta el tamaño indicado
 Inconvenientes
 Puede realizar cargas que después no se van a
usar
 El tamaño del lote requiere ajuste

min(tamaño lote, los proxies User sin inicializar)


nov-08 Alberto M.F.A. alb@uniovi.es 11
Prefetch en lotes

nov-08 Alberto M.F.A. alb@uniovi.es 12


Prefetch con subselects
 Se realiza una segunda select que
incluye a la primera como subselect
 No necesita ajustes
 Ideal si se va a recorrer toda la
colección (o size(), contains())

nov-08 Alberto M.F.A. alb@uniovi.es 13


Prefetch con subselects

nov-08 Alberto M.F.A. alb@uniovi.es 14


Eager JOIN
 Solo para estrategias EAGER
 Por defecto en colec. EAGER en JPA con
Hibernate
 Atención a colecciones paralelas:
¡Producto cartesiano !

nov-08 Alberto M.F.A. alb@uniovi.es 15


Eager JOIN

nov-08 Alberto M.F.A. alb@uniovi.es 16


Eager con SELECT
 Se lanza una segunda select en vez de
JOIN para evitar producto cartesiano

nov-08 Alberto M.F.A. alb@uniovi.es 17


Guía de optimización
 Activar el log SQL en persistence.xml

 Dejar todas las opciones por defecto.


 Ejecutar cada caso de uso observando
el log para detectar cuales son los que
generan un tráfico anómalo.

nov-08 Alberto M.F.A. alb@uniovi.es 18


Guía de optimización (2)
 Si hay mucho tráfico:
 Ajustes en las queries.
 Si el tráfico se genera en algunos casos de uso
concretos se puede mejorar el rendimiento
dinámico solo para ellos. Suele ser la mejor
estrategia.
 Emplear left join fetch o join fetch en las
queries que generan más tráfico

nov-08 Alberto M.F.A. alb@uniovi.es 19


Guía de optimización (3)
 Si sigue habiendo mucho tráfico:
 Ajustes en los ficheros de mapeo
 Si son muchos los casos de uso afectados
ajustar ficheros de mapeo (no es habitual).
 Para -to-one ponerFetchType.LAZY y batch-
size=”<número>”
 Colecciones de pocos elementos lazy=”false” y
fetch=”subselect”

nov-08 Alberto M.F.A. alb@uniovi.es 20


Guía de optimización (4)
 Ajustes en los ficheros de mapeo
 En caso necesario (muy raro y en general
desaconsejado) se puede poner fetch=”join”
en colecciones xxxx–to-many. Ojo colecciones
paralelas.
 Atención a los caminos fetch=”join” que se
forman al mapear varias asociaciones así. Se
pueden cargar grafos muy profundos lo que
supone subir muchos objetos a memoria. Se
puede usar la propiedad max_fetch_depth para
establecer el camino máximo.
nov-08 Alberto M.F.A. alb@uniovi.es 21

You might also like