Sistemas de persistencia de objetosdi002.edv.uniovi.es/~alberto_mfa/?download=6. Estrategias de...

21
Estrategias de fetch Sistemas de persistencia de objetos

Transcript of Sistemas de persistencia de objetosdi002.edv.uniovi.es/~alberto_mfa/?download=6. Estrategias de...

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

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

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

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

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

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

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

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

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 9: 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

Carga eager

nov-08 Alberto M.F.A. [email protected] 9

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

¿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

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 12: 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

Prefetch en lotes

nov-08 Alberto M.F.A. [email protected] 12

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

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 14: 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

Prefetch con subselects

nov-08 Alberto M.F.A. [email protected] 14

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

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 16: 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

Eager JOIN

nov-08 Alberto M.F.A. [email protected] 16

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

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

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

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

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

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