![Page 1: Sistemas de persistencia de objetosdi002.edv.uniovi.es/~alberto_mfa/?download=6. Estrategias de fetch.… · Sistemas de persistencia de objetos. Fetch Forma de recuperar objetos](https://reader036.vdocuments.co/reader036/viewer/2022081517/5f01d55f7e708231d401439f/html5/thumbnails/1.jpg)
Estrategias de fetch
Sistemas de persistencia de objetos
![Page 2: Sistemas de persistencia de objetosdi002.edv.uniovi.es/~alberto_mfa/?download=6. Estrategias de fetch.… · Sistemas de persistencia de objetos. Fetch Forma de recuperar objetos](https://reader036.vdocuments.co/reader036/viewer/2022081517/5f01d55f7e708231d401439f/html5/thumbnails/2.jpg)
Fetch
� Forma de recuperar objetos de la BDD y meterlos en contexto de persistencia
� En memoria los objetos forman un grafo por sus asociaciones
nov-08 Alberto M.F.A. [email protected] 2
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?
![Page 3: Sistemas de persistencia de objetosdi002.edv.uniovi.es/~alberto_mfa/?download=6. Estrategias de fetch.… · Sistemas de persistencia de objetos. Fetch Forma de recuperar objetos](https://reader036.vdocuments.co/reader036/viewer/2022081517/5f01d55f7e708231d401439f/html5/thumbnails/3.jpg)
Estrategia de fetch
� ¿Cuándo se suben de la BDD?
� Los objetos asociados con un objeto dado
� Dos momentos:� 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. [email protected] 3
![Page 4: Sistemas de persistencia de objetosdi002.edv.uniovi.es/~alberto_mfa/?download=6. Estrategias de fetch.… · Sistemas de persistencia de objetos. Fetch Forma de recuperar objetos](https://reader036.vdocuments.co/reader036/viewer/2022081517/5f01d55f7e708231d401439f/html5/thumbnails/4.jpg)
Estrategias de fetch
� ¿Cómo se cargan? (los asociados)
� Ya sea LAZY o EAGER, en el momento que se decide cargarlos ¿cómo?se decide cargarlos ¿cómo?
� Varios tipos:
� Batch prefetch
� Subselect
� Eager JOIN
� Eager Select
nov-08 Alberto M.F.A. [email protected] 4
� Ajustes Hibernate
![Page 5: Sistemas de persistencia de objetosdi002.edv.uniovi.es/~alberto_mfa/?download=6. Estrategias de fetch.… · Sistemas de persistencia de objetos. Fetch Forma de recuperar objetos](https://reader036.vdocuments.co/reader036/viewer/2022081517/5f01d55f7e708231d401439f/html5/thumbnails/5.jpg)
Lazy load con proxies
� Es un proxy� Es un proxy
� No se ha hecho select a la BDD
nov-08 Alberto M.F.A. [email protected] 5¡ No selects !
![Page 6: Sistemas de persistencia de objetosdi002.edv.uniovi.es/~alberto_mfa/?download=6. Estrategias de fetch.… · Sistemas de persistencia de objetos. Fetch Forma de recuperar objetos](https://reader036.vdocuments.co/reader036/viewer/2022081517/5f01d55f7e708231d401439f/html5/thumbnails/6.jpg)
Lazy load de asociaciones
� Las asociaciones son proxiesproxies
� -ToOne: Se cargan al refenrenciarlos
� -ToMany: Al acceder a cualquier método de la colección
nov-08 Alberto M.F.A. [email protected] 6
![Page 7: Sistemas de persistencia de objetosdi002.edv.uniovi.es/~alberto_mfa/?download=6. Estrategias de fetch.… · Sistemas de persistencia de objetos. Fetch Forma de recuperar objetos](https://reader036.vdocuments.co/reader036/viewer/2022081517/5f01d55f7e708231d401439f/html5/thumbnails/7.jpg)
Configuración lazy: posibilidades
� En JPA por defecto:� LAZY: asociaciones –ToMany
� EAGER: asociaciones –ToOne
Posibilidades:� 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. [email protected] 7
![Page 8: Sistemas de persistencia de objetosdi002.edv.uniovi.es/~alberto_mfa/?download=6. Estrategias de fetch.… · Sistemas de persistencia de objetos. Fetch Forma de recuperar objetos](https://reader036.vdocuments.co/reader036/viewer/2022081517/5f01d55f7e708231d401439f/html5/thumbnails/8.jpg)
Desactivar la carga lazy de una clase
nov-08 Alberto M.F.A. [email protected] 8
Ya no carga proxy
Al cargar el Item se cargan todos los usuarios relacionados por cualquier asociación
![Page 10: Sistemas de persistencia de objetosdi002.edv.uniovi.es/~alberto_mfa/?download=6. Estrategias de fetch.… · Sistemas de persistencia de objetos. Fetch Forma de recuperar objetos](https://reader036.vdocuments.co/reader036/viewer/2022081517/5f01d55f7e708231d401439f/html5/thumbnails/10.jpg)
¿Cómo cargar las asociaciones?
Poco eficiente
nov-08 Alberto M.F.A. [email protected] 10
Poco eficiente, el problema de las n+1 consultas
![Page 11: Sistemas de persistencia de objetosdi002.edv.uniovi.es/~alberto_mfa/?download=6. Estrategias de fetch.… · Sistemas de persistencia de objetos. Fetch Forma de recuperar objetos](https://reader036.vdocuments.co/reader036/viewer/2022081517/5f01d55f7e708231d401439f/html5/thumbnails/11.jpg)
Prefetch en lotes
� Ajuste: tamaño del lote� Cuando se necesite hacer carga se suben en lotes de hasta el tamaño indicado
� Inconvenientes� Inconvenientes� Puede realizar cargas que después no se van a usar
� El tamaño del lote requiere ajuste
nov-08 Alberto M.F.A. [email protected] 11
min(tamaño lote, los proxies User sin inicializar)
![Page 13: Sistemas de persistencia de objetosdi002.edv.uniovi.es/~alberto_mfa/?download=6. Estrategias de fetch.… · Sistemas de persistencia de objetos. Fetch Forma de recuperar objetos](https://reader036.vdocuments.co/reader036/viewer/2022081517/5f01d55f7e708231d401439f/html5/thumbnails/13.jpg)
Prefetch con subselects
� Se realiza una segunda select que incluye a la primera como subselect
� No necesita ajustes� No necesita ajustes
� Ideal si se va a recorrer toda la colección (o size(), contains())
nov-08 Alberto M.F.A. [email protected] 13
![Page 15: Sistemas de persistencia de objetosdi002.edv.uniovi.es/~alberto_mfa/?download=6. Estrategias de fetch.… · Sistemas de persistencia de objetos. Fetch Forma de recuperar objetos](https://reader036.vdocuments.co/reader036/viewer/2022081517/5f01d55f7e708231d401439f/html5/thumbnails/15.jpg)
Eager JOIN
� Solo para estrategias EAGER
� Por defecto en colec. EAGER en JPA con HibernateHibernate
� Atención a colecciones paralelas: ¡Producto cartesiano !
nov-08 Alberto M.F.A. [email protected] 15
![Page 17: Sistemas de persistencia de objetosdi002.edv.uniovi.es/~alberto_mfa/?download=6. Estrategias de fetch.… · Sistemas de persistencia de objetos. Fetch Forma de recuperar objetos](https://reader036.vdocuments.co/reader036/viewer/2022081517/5f01d55f7e708231d401439f/html5/thumbnails/17.jpg)
Eager con SELECT
� Se lanza una segunda select en vez de JOIN para evitar producto cartesiano
nov-08 Alberto M.F.A. [email protected] 17
![Page 18: Sistemas de persistencia de objetosdi002.edv.uniovi.es/~alberto_mfa/?download=6. Estrategias de fetch.… · Sistemas de persistencia de objetos. Fetch Forma de recuperar objetos](https://reader036.vdocuments.co/reader036/viewer/2022081517/5f01d55f7e708231d401439f/html5/thumbnails/18.jpg)
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. [email protected] 18
![Page 19: Sistemas de persistencia de objetosdi002.edv.uniovi.es/~alberto_mfa/?download=6. Estrategias de fetch.… · Sistemas de persistencia de objetos. Fetch Forma de recuperar objetos](https://reader036.vdocuments.co/reader036/viewer/2022081517/5f01d55f7e708231d401439f/html5/thumbnails/19.jpg)
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 � 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. [email protected] 19
![Page 20: Sistemas de persistencia de objetosdi002.edv.uniovi.es/~alberto_mfa/?download=6. Estrategias de fetch.… · Sistemas de persistencia de objetos. Fetch Forma de recuperar objetos](https://reader036.vdocuments.co/reader036/viewer/2022081517/5f01d55f7e708231d401439f/html5/thumbnails/20.jpg)
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 � 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. [email protected] 20
![Page 21: Sistemas de persistencia de objetosdi002.edv.uniovi.es/~alberto_mfa/?download=6. Estrategias de fetch.… · Sistemas de persistencia de objetos. Fetch Forma de recuperar objetos](https://reader036.vdocuments.co/reader036/viewer/2022081517/5f01d55f7e708231d401439f/html5/thumbnails/21.jpg)
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 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. [email protected] 21