persistencia para objetos - di002.edv.uniovi.esdi002.edv.uniovi.es/~alberto_mfa/?download=1....
Post on 08-Oct-2020
10 Views
Preview:
TRANSCRIPT
Persistencia para Objetos
Introducción
Persistencia� Necesidad de que los datos manejados por un
programan sobrevivan más allá de la ejecución de este.� Pocos programas no necesitan persistencia
PPO � persistencia
nov-08 alb@uniovi.es 2
� Pocos programas no necesitan persistencia� Pero un tipo de programas la necesitan con especial énfasis:
� Los Sistemas de Información� Son un mercado muy amplio
� Varias formas de conseguirla� Ficheros� Bases de datos� Etc…
Bases de datos relacionales
� Muy extendidas� Grandes inversiones en las empresas� Muy robustas� Modelo muy flexible
Soporte completo y consistente en el álgebra relacional
PPO � persistencia
nov-08 alb@uniovi.es 3
� Soporte completo y consistente en el álgebra relacional� Con añadido de SQL
� Permiten Independencia de datos y procesos� Los datos sobreviven a las aplicaciones� Muchas nuevas aplicaciones están obligadas a trabajar con
BBDD heredadas� Permiten interoperabilidad entre aplicaciones
� Forma de compartir datos entre aplicaciones� Común denominador de muchos sistemas y tecnologías
dispares
SQL, varios lenguajes
� Más o menos estándar� DDL� DML
insertBases de datos relacionales + SQL son
PPO � persistencia
nov-08 alb@uniovi.es 4
� insert� update� delete
� Queries� join� selection� projection
Bases de datos relacionales + SQL son un poderoso tándem imposible de desbancar.
Están para quedarse todavía mucho tiempo.
SQL en Java
� Usando el API JDBC� Programando directamente JDBC API
� Connection, Statement, ResultSet, etc.
� Generación automática de código
PPO � persistencia
nov-08 alb@uniovi.es 5
� Generación automática de código� Desde modelos (MDA, MDD, etc.)� SQLJ (SQL incrustado en Java)
� Cuestiones de bajo nivel expuestas al programador� Código muy tedioso
� Se pierde el diseño Orientado a Objetos� Todo son tablas, filas y sentencias� Lleva a retorcer los modelos de objetos elegantes para que
se adapten al modelo relacional
SQL en Java (2)
� ¿Es SQL y el modelo relacional apto para programar aplicaciones orientadas a objetos ?
Son paradigmas distintos, pero…
PPO � persistencia
nov-08 alb@uniovi.es 6
� Son paradigmas distintos, pero…� … en cuanto a persistencia:
� Las BBDD relacionales son muy sólidas� Están muy extendidas� Es lo que hay� …pero son distintos paradigmas…
SQL en Java (3)
SQL en Java (3)
nov-08 alb@uniovi.es 7
Aplicaciones OO con persistencia
� Tipos de objetos:� Objetos persistentes, se necesita:
� Almacenamiento, organización y recuperaciónConcurrencia e integridad de datos
PPO � persistencia
nov-08 alb@uniovi.es 8
� Concurrencia e integridad de datos� Objetos transitorios
� Modelo de dominio� Analizado, Diseñado e implementado en un lenguaje OO
� Persistencia en BBDD relacional
Distintosparadigmas
La desadaptación
Diferentes paradigmas
� Mundo OO� Los objetos se relacionan entre si formando grafos� Navegación por referencias� No hay modelo formal
PPO � desadaptación
nov-08 alb@uniovi.es 10
� No hay modelo formal� Mundo Relacional
� Los datos están en tablas con integridad referencial
� Operaciones con semántica formal definidas por el algebra relacional
� Operaciones siempre dan tablas (conjuntos)� No hay navegación, hay joins entre tablas
Ejemplo
PPO � desadaptación
nov-08 alb@uniovi.es 11
En realidad en Java son dos referencias
Ejemplo en Relacional
PPO � desadaptación
nov-08 alb@uniovi.es 12
Diferentes paradigmas� El análisis se hace orientado a objetos� El diseño también (patrones de diseño, etc)� Disponemos de lenguajes OO (java en este caso)
PPO � desadaptación
nov-08 alb@uniovi.es 13
caso)� Pero si tiene que haber persistencia…
� ¿ hay que renunciar a los modelos OO de diseño y retorcerlo todo para ajustarlo al paradigma relacional ?
� … y acabo programando pensando en tablas, filas, ResulSets y Statements
Diferencias
� Estructurales� Granularidad� IdentidadSubtipado
Poca
PPO � desadaptación
nov-08 alb@uniovi.es 14
� Subtipado� Asociaciones
� Dinámicas� Navegación� Cacheado� Concurrencia
Grado de dificultad
Mucha
Granularidad: Ejemplo
Address en un atributo de una clase y una clase
PPO � desadaptación � diferencias estructurales
nov-08 alb@uniovi.es 15
Granularidad
� En un modelo OO hay varios tipos de clases � Entidades (Entities)
� Tienen identidad propia y participan en relaciones
PPO � desadaptación � diferencias estructurales
nov-08 alb@uniovi.es 16
� Value Types� No se necesita conocer su identidad, sólo su valor
� String, Date, Time, Money, Integer, Complex…
� No participan en relaciones, son atributos� Semántica de composición
� Su ciclo de vida está ligado al de la clase
Granularidad
� En la BDD desaparece la distinción:� Todo a una única tabla
� Sí, hay alternativa:
PPO � desadaptación � diferencias estructurales
nov-08 alb@uniovi.es 17
� Sí, hay alternativa:� Usar UDT's, objetos definidos por el usuario en la BDD
� Pero se usan muy poco� Están pobremente definidos en los estándares
Subtipos: Ejemplo
PPO � desadaptación � diferencias estructurales
nov-08 alb@uniovi.es 18
Subtipos
� En los objetos está en el lenguaje� En el modelo relacional:
� No existe en la mayoría de las BBDD
PPO � desadaptación � diferencias estructurales
nov-08 alb@uniovi.es 19
� No existe en la mayoría de las BBDD� En algunas existe pero no es estándar� El programador lo simula con varias estrategias
� No existe el polimorfismo� Una clave se refiere únicamente a una tabla y no a varias
Identidad
� En java � Identidad (a == b)
� dos referencias que apuntan al mismo objeto
PPO � desadaptación � diferencias estructurales
nov-08 alb@uniovi.es 20
� dos referencias que apuntan al mismo objeto
� Equivalencia (a.equals(b))� dos objetos que contienen los mismos valores
� En BDD relacional� Dos filas son la misma si tienen la misma clave
Identidad
� Implicaciones en ejecución� Objeto persistente en memoria es una representación de una fila de la BBDD
PPO � desadaptación � diferencias estructurales
nov-08 alb@uniovi.es 21
representación de una fila de la BBDD� ¡ Hay 3 identidades !
� ==� equals� Identidad por clave
� representan la misma fila� se comparan las claves primarias
3 identidades En este caso userA y userB:•No son iguales•No son equivalentes•¡Pero son la misma fila!
PPO � desadaptación � diferencias estructurales
nov-08 alb@uniovi.es 22
userA == userB ���� falseuserA.equals(userB) ���� falseuserA.getKey().equals(userB.getKey()) ���� true
Identidad
� Se necesita asociar la identidad Java con la identidad en la Tabla
� equals() debe definirse sobre los datos
PPO � desadaptación � diferencias estructurales
nov-08 alb@uniovi.es 23
� equals() debe definirse sobre los datos del objeto
� Varios hilos concurrentes modificando datos hacen que equals() sea distinto
� Problemas con los java.util.Set
Asociaciones
� En Objetos� Navegabilidad
Unidireccional
PPO � desadaptación � diferencias estructurales
nov-08 alb@uniovi.es 24
� Unidireccional� Bidireccional
� Cardinalidad� Úníca� Múltiple
� … y visibilidad
Navegavilidad en OO
� Unidireccional� Sólo se mantiene una referencia (sólo un objeto apunta al otro)
PPO � desadaptación � diferencias estructurales
nov-08 alb@uniovi.es 25
� Bidireccional� referencias cruzadas� la asociación se debe declarar ¡2 veces!
� Y asignar dos veces
� los lenguajes OO al uso no soportan el concepto de asociación
PPO � desadaptación � diferencias estructurales
Cardinalidad
� Única� atributo sencillo
� Múltiple
nov-08 alb@uniovi.es 26
� Múltiple� colección
� one-to-one� one-to-many� many-to-many
Navegación en OO
� Recorriendo las referencias
� Como aristas de un grafo de objetos
PPO � desadaptación � diferencias estructurales
nov-08 alb@uniovi.es 27
� Como aristas de un grafo de objetos
Asociaciones en Relacional
� Mediante claves ajenas� No tienen dirección, no hay navegación
� Se recuperan datos con consultas que
PPO � desadaptación � diferencias estructurales
nov-08 alb@uniovi.es 28
� Se recuperan datos con consultas que hacen joins
Cardinalidad en Relacional
� one-to-one
� one-to-many
PPO � desadaptación � diferencias estructurales
nov-08 alb@uniovi.es 29
� one-to-many
� many-to-many� hay que meter una tabla de enlace
Diferencias dinámicas
� Generan perdidas de eficiencia� Navegación� Cacheado
PPO � desadaptación
nov-08 alb@uniovi.es 30
� Cacheado� Concurrencia
Navegación: Ejemplo
� OO
� SQL
PPO � desadaptación � diferencias dinámicas
nov-08 alb@uniovi.es 31
� SQL
Navegación
� En java se recorre un grafo libremente usando las referencias entre objetos.� Todos los objetos en memoria, los limites
PPO � desadaptación � diferencias dinámicas
nov-08 alb@uniovi.es 32
� Todos los objetos en memoria, los limites son los del grafo
� En SQL se indica qué JOINS hacer, lo que implica conocer de antemano que recorrido vamos a hacer
Navegación
� Se busca crear la ilusión de que todos los objetos ya están en memoria� Solución: cargar el grafo dinámicamente
PPO � desadaptación � diferencias dinámicas
nov-08 alb@uniovi.es 33
� Solución: cargar el grafo dinámicamente según se va recorriendo: lazy loading
� Pero eso puede tener bajo rendimiento� Demasiadas SELECT * FROM …
El problema de las n+1 consultas
N + 1 Selects, ejemplo
nov-08 alb@uniovi.es 34
Navegación + problemas
� Para evitar demasiadas n+1 SELECT� Cargar muchos datos de cada vez �muchos joins
PPO � desadaptación � diferencias dinámicas
nov-08 alb@uniovi.es 35
muchos joins� Nuevo problema:
� Se cargan demasiados datos� Se atasca la conexión a la BBDD� La máquina se puede quedar sin memoria
El problema del producto cartesiano
Producto cartesiano, ejemplo
1000 items * 20 bids * 5 images = 100.000 filas!
nov-08 alb@uniovi.es 36
1000 items * 20 bids * 5 images = 100.000 filas!
Navegación
� Buscar compromiso adecuado� Estudiar los recorridos al grafo para cada Unidad de trabajo
PPO � desadaptación � diferencias dinámicas
nov-08 alb@uniovi.es 37
cada Unidad de trabajo� Cargar sólo lo necesario
� Varias estrategias de fetching� Prefetch� Fetch en batch� Join selecctivos
Cacheado
� Optimiza el rendimiento al reducir el trasiego con la BBDD
� Permite hacer optimizaciones
PPO � desadaptación � diferencias dinámicas
nov-08 alb@uniovi.es 38
� Permite hacer optimizaciones� Write-behind delayed� Batch load/update
� ¿Caché por proceso?, ¿por hilo?, ¿por cluster?
Concurrencia
� Varios hilos de ejecución (usuarios) trabajando sobre los mismos datos…� Que pueden estar en caché…
PPO � desadaptación � diferencias dinámicas
nov-08 alb@uniovi.es 39
� Que pueden estar en caché…� ¿Como se controlan las transacciones ACID?
� Si ya la base de datos lo sabe hacer
PPO � desadaptación � diferencias dinámicas
Diferencias: coste
� El dedicado en desarrollo sólo a JDBC en proyectos ronda el 30%, 40%
� El código que se escribe funciona pero es muy farragoso y repetitivo
nov-08 alb@uniovi.es 40
muy farragoso y repetitivo� Errores, mal mantenimiento, etc.
� Puede tener problemas de rendimiento igualmente� No todos los programadores somos gurus del SQL y del JDBC
Organización de persistencia en aplicaciones OO
Arquitecturas en capas
� Ayuda a confinar el código dedicado a persistencia haciendo la
PPO � resolución
nov-08 alb@uniovi.es 42
persistencia haciendo la lógica más independiente
� La capa de persistencia ofrece APIS empleadas desde la de negocio Pero sigue habiendo
dependencia
SQL/JDBC a mano
� Objetos de la API JDBC:� Connections, Statements, ResultSets, etc.� SQL, procedimientos almacenados, etc.
PPO � resolución
nov-08 alb@uniovi.es 43
� Patrón DAO� Recomendable incluso con ORM� Define interfaces de persistencia genéricos independientes de la tecnología
� La persistencia se hace menos intrusiva con la lógica. Hay que escribir los DAOs
Modelo de objetos JDBC
Statement
<crea>
<excuteQuery>
PPO � resolución
nov-08 Alberto M.F.A. alb@uniovi.es 44
Connection PreparedStatement
CallableStatement
ResultSet
Serialización
� Demasiado básico:� Persiste grafos completos� No se pueden hacer consultas
PPO � resolución
nov-08 alb@uniovi.es 45
� El grafo entero debe volver a memoria para ser tratado
� ¿Como se soporta la concurrencia?
� XML mapping (una variación)� Las BBDD XML ofrecen más cosas pero te pueden exponer a otro salto de paradigma: object/hierarquical
Serialización, ejemplo java
nov-08 alb@uniovi.es 46
Bases de datos OO
� Podrían estar bien pero...� No tienen el grado de aceptación de las BBDD relacionales en el mercado
PPO � resolución
nov-08 alb@uniovi.es 47
BBDD relacionales en el mercado� No tienen el grado de estandarización� Las BBDDOO se adaptan a los lenguajes y por lo tanto no permiten fácilmente la interoperabilidad del SQL
Object/Relational Mapping
� Persistencia automática y transparente a objetos Java en BBDD relacionales� con ciertas cargas de rendimiento� y mínima intrusividad en el código
PPO � resolución
nov-08 alb@uniovi.es 48
� y mínima intrusividad en el código� Ventajas
� Soporta concurrencia� Ofrecen lenguajes de consultas OO� Tiene en cuenta el estado del arte actual (BBDD relacionales)
� Se programa pensando en objetos� No es necesario escribir JDBC
Object/Relational Mapping
Componentes de un ORM
� API para CRUD� Lenguaje o API para hacer consultas� Metadatos
PPO � mapeadores ORM
nov-08 alb@uniovi.es 50
� Metadatos� Técnicas/políticas configurables para la interacción objeto/relacional� Cacheado� Fetching� Transaciones
Clasificación de los ORM
� Pure relational� Procedimientos almacenados� Gestión del SQL directa� Apto para pequeñas aplicaciones (pocas tablas)� Problemas de mantenibilidad
PPO � mapeadores ORM
nov-08 alb@uniovi.es 51
� Problemas de mantenibilidad� Light object mapping
� Clases mapeadas directamente a tablas� SQL se oculta tras patrones (DAO) o en clases abstractas
� Medium� Aplicación diseñada alrededor de un modelo de objetos� SQL generado o soportado por un framework en runtime� Se soportan asociaciones y lenguajes de consultas OO� Puede ser hecho a mano
Clasificación de los ORM(2)
� Full� Semántica de Composición� Herencia
PPO � mapeadores ORM
nov-08 alb@uniovi.es 52
� Herencia� Polimorfismo� Persistencia por alcanzabilidad� Persistencia transparente� Estrategias de fetching� Muy complejos para hacerlos a mano
Curiosidad: Hibernate 80.000 LOC + 25.000 LOC test
Problemas genéricos en ORM� Transparencia� Metadatos� Identidad� Jerarquías de herencia
PPO � mapeadores ORM
nov-08 alb@uniovi.es 53
� Jerarquías de herencia� Interacción en runtime� Ciclo de vida de los obj. Persistentes� Recuperación de asociaciones� Consultas� Transacciones y concurrencia� Cacheado
PPO � mapeadores ORM
Transparencia
� ¿Clase JAVA normal (POJO) ?...� Plain Old/Ordinary Java Objects
� ¿O debe heredar de alguna otra clase o
nov-08 alb@uniovi.es 54
� ¿O debe heredar de alguna otra clase o implementar algún interfaz?
� ¿Se debe adoptar algún convenio de nombrado?
PPO � mapeadores ORM
Metadatos
� Se necesitan para aportar información que no hay en el lenguaje referente a la persistencia:� Tablas, conexiones, claves, políticas de fetching, caché, etc.
nov-08 alb@uniovi.es 55
caché, etc.
� En forma de XML, anotationsanotations ((1.5, JPA)1.5, JPA), properties
� Calidad de los metadatos� Concisión� ¿Valores por defecto con sentido común?
Jerarquías de herencia
� Hay varias estrategias� ¿Se soportan asociaciones polimórficas, clases abstractas e interfaces?
PPO � mapeadores ORM
nov-08 alb@uniovi.es 56
clases abstractas e interfaces?
Interacción en runtime
� Generación de código en compilación� Pasos de precompilación
� Runtime reflection
PPO � mapeadores ORM
nov-08 alb@uniovi.es 57
� Runtime reflection� Runtime bytecode generation� Buildtime byte code enhacement
� Instrumentación de código
Beneficios de usar un ORM
� Productividad� Se escribe menos código, con menos errores
� Mantenibilidad< LOC
PPO � mapeadores ORM
nov-08 alb@uniovi.es 58
� < LOC� Modelos del dominio son OO, se piensa en objetos
� Rendimiento� Bastante eficiente, muy optimizado� Posibilidad de ejecutar código malo de cualquier forma
� Independencia de la BBDD
Soluciones ORM
� Estándares� EJB 3.0
� EJB 2.1, 2.0, 1.1, 1.0 no son POJOS JPA (subespecificación de EJB 3.0 para
PPO � mapeadores ORM
nov-08 alb@uniovi.es 59
� JPA (subespecificación de EJB 3.0 para persistencia)
� Nativas� Hibernate 1.x, 2.x, 3.3.1 (nov 2008)� TopLink� Etc.
EJB3.0
� Especificación para java en entorno industrial. Código se ejecuta en servidor de aplicaciones.
PPO � mapeadores ORM
nov-08 alb@uniovi.es 60
de aplicaciones.� Contempla muchos servicios
� JNDI� Remoteness� Transacciones distribuidas� Persistencia…
Hibernate es el motor de persistencia en JBoss AS 4.0
Hibernate: Relational Persistence for Java and .NET
PPO � mapeadores ORM
nov-08 alb@uniovi.es 61
http://www.hibernate.org/
PPO � mapeadores ORM
Referencias
� Libro
� http://www.hibernate.org
Java persistence with HibernateChistian Bauer y Gaving KingManningISBN: 1-932394-88-5
nov-08 alb@uniovi.es 62
� http://www.hibernate.org
� Base de datos para ejercicios� http://www.hsqldb.org
top related