Mapping Objet Relationnel (ORM) Partie 1 : Principes & Fonctionnement en lecture SQL Généré Optimisations



Documents pareils
Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

OpenPaaS Le réseau social d'entreprise

Java et les bases de données

Types d applications pour la persistance. Outils de développement. Base de données préexistante? 3 modèles. Variantes avec passerelles

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

Compte Rendu d intégration d application

Accès aux bases de données

Java DataBaseConnectivity

Application BdD et JDBC. Introduction 1/28. I Dans tout les cas, une seule problématique. I Quelques alternatives :

Cours 3. Développement d une application BD. DBA - Maîtrise ASR - Université Evry

Programmation d application Bases de données avec Java

Optimisations des SGBDR. Étude de cas : MySQL

Introduction à JDBC. Accès aux bases de données en Java

Hala Skaf-Molli. Nancy-Université 14 mai 2007

Notes de cours : bases de données distribuées et repliquées

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

Développement Web - Object Relational Mapping and Hibernate

Bases de Données relationnelles et leurs systèmes de Gestion

Application web de gestion de comptes en banques

TP Programmation Java / JDBC / Oracle

SGBDR. Systèmes de Gestion de Bases de Données (Relationnelles)

SQL. Oracle. pour. 4 e édition. Christian Soutou Avec la participation d Olivier Teste

Performances. Gestion des serveurs (2/2) Clustering. Grid Computing

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

Les bases de données

CREATION WEB DYNAMIQUE

Auto-évaluation Oracle: cours de base

Optimisation SQL. Quelques règles de bases

Sybase Adaptive Server Enterprise 15

Administration des bases de données. Jean-Yves Antoine

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

Les bases de l optimisation SQL avec DB2 for i

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

Mysql. Les requêtes préparées Prepared statements

Formation Webase 5. Formation Webase 5. Ses secrets, de l architecture MVC à l application Web. Adrien Grand <jpountz@via.ecp.fr> Centrale Réseaux

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

MapReduce. Malo Jaffré, Pablo Rauzy. 16 avril 2010 ENS. Malo Jaffré, Pablo Rauzy (ENS) MapReduce 16 avril / 15

Session S12 Les bases de l optimisation SQL avec DB2 for i

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

ORACLE 10G DISTRIBUTION ET REPLICATION. Distribution de données avec Oracle. G. Mopolo-Moké prof. Associé UNSA 2009/ 2010

Le Langage De Description De Données(LDD)

Création d une application JEE

Hibernate vs. le Cloud Computing

La gestion de la persistance avec Hibernate. Hibernate et la gestion de persistance. La gestion de la persistance (1/2) Introduction

Architecture Orientée Service, JSON et API REST

ISC Système d Information Architecture et Administration d un SGBD Compléments SQL

Bases de Données Avancées

Architecture JEE. Objectifs attendus. Serveurs d applications JEE. Architectures JEE Normes JEE. Systèmes distribués

SQL Historique

Java Aspect Components (JAC)

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

Institut Supérieur de Gestion. Cours pour 3 ème LFIG. Java Enterprise Edition Introduction Bayoudhi Chaouki

ECR_DESCRIPTION CHAR(80), ECR_MONTANT NUMBER(10,2) NOT NULL, ECR_SENS CHAR(1) NOT NULL) ;

Le langage SQL pour Oracle - partie 1 : SQL comme LDD

Cours Bases de données 2ème année IUT

Le langage SQL (première partie) c Olivier Caron

Europa. Développement JEE 5. avec Eclipse. K a r i m D j a a f a r. A v e c l a c o n t r i b u t i o n d e O l i v i e r S a l v a t o r i

TP Contraintes - Triggers

C-JDBC. Emmanuel Cecchet INRIA, Projet Sardes.

Paginer les données côté serveur, mettre en cache côté client

Configurer la supervision pour une base MS SQL Server Viadéis Services

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

L offre décisionnel IBM. Patrick COOLS Spécialiste Business Intelligence

Bases de données relationnelles

27/11/12 Nature. SDK Python et Java pour le développement de services ACCORD Module(s)

Projet gestion d'objets dupliqués

Mercredi 15 Janvier 2014

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

Devoir Data WareHouse

EJB. Karim Bouzoubaa Issam Kabbaj

Partie 0 : Gestion des tablespace et des utilisateurs... 3

Olivier Mondet

Plan. Accès aux données dans le framework.net. ADO.NET Entity Framework LINQ ADO.NET ADO.NET. 1. ADO.NET Mode connecté Mode non connecté

JOnAS 5. Serveur d application d

Architectures d'intégration de données

GPC Computer Science

Cours Bases de données

Bases de données et sites WEB Licence d informatique LI345

Bases de données et sites WEB

Laboratoires de bases de données. Laboratoire n 6. Programmation SQL. par Danièle BAYERS et Louis SWINNEN

Procédures Stockées WAVESOFT ws_sp_getidtable Exemple : ws_sp_getnextsouche Exemple :... 12

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Devenez un véritable développeur web en 3 mois!

Master Exploration Informatique des données DataWareHouse

A QUOI SERVENT LES BASES DE DONNÉES?

Intégrateur de l ERP Proginov 25 chefs de projet et 32 développeurs dédiés aux clients Proginov

A.E.C. GESTION DES APPLICATIONS TECHNOLOGIE DE L'INFORMATION LEA.BW

Présentation du module Base de données spatio-temporelles

Programmer en JAVA. par Tama

MySQL avec Mac OS X. Quelques manipulations avec le terminal sont nécessaires si une version de MySQL est déjà lancée:

CHAPITRE 1 ARCHITECTURE

Django et PostgreSQL sous la charge

Cedric Dumoulin (C) The Java EE 7 Tutorial

Réplication E-maj Foreign Data Wrapper PostGIS PostgreSQL-f

Transcription:

L informatique qui réinvente la finance Mapping Objet Relationnel (ORM) Partie 1 : Principes & Fonctionnement en lecture SQL Généré Optimisations Arnaud NAUWYNCK arnaud.nauwynck@gmail.com

Plan Introduction Architecture, Outils ORM API Language L4G <-> SGBDR Accès en Lecture Fonctionnement Relation 1-1, 1-N, Héritage Problèmes de performances Optimisations Modèle, Index Optimisations Mapping, Caches Optimisations Oracle 2

Audience - Prérequis PAS un tutorial hibernate/jpa/ejb... Pré-requis: connaissances SGBD / persistence But: explications avancées Problèmes de mapping Object vs Relationnel SQL généré Problèmes de Performances, Optimisations Réduire distance Développeur / DBA 3

Domaine Développeur - DBA Répartition des taches, outils... OK Répartition des connaissances, compréhension? Spec UML Clients, MOAs IDE Code Code Model Fonctionel Server App, Jta ORM UML Développeurs IDE SQL Jdbc MCD MPD Architectes 4 DBAs

Architecture 3-Tiers Serveur Web Http WebService Clients Web Serveur Applicatif SGBD EJB Rmi Corba... Clients 5

Couches: Applicatives, DAO, ORM, Jdbc Presentation Business Logic DAO DAO Converter DTO Model ORM JDBC 6

JDBC Sample Code Connection conn =... PreparedStatement pstmt = null; try { String sql = select * from emp where id =? ; pstmt = conn.preparedstatement(sql) ; pstmt.setint(1, id); ResultSet rs = pstmt.executequery(); while(rs.hasnext()) { rs.next(); int val = rs.getint(1);... } } finally { safeclose(pstmt); } 7

DAO BMP : CRUD public class EmpDAO extends DAO { C Create... insert into EMP (id, name) values(?,?) R Read... select * from EMP where id =?... select * from where... U Update... update EMP set name=?,...=? where id=? D Delete... delete EMP where id =? class EMP int id String name Mappings CRUD Class : Table Obj Field : Table Column Table EMP number id varchar(..) name 8

Problèmes CRUD - BMP Code simple... mais Fastidieux copier&coller *3 pour Select/Update/Create! Code Query et Mapping imbriqués Performances Avantages: 1 appel => SQL Explicit Inconvénients: contrôle des appels Framework nécessaire! Cache pour 'Read' XA pour 'Update' 9

ORMs : CMP/JDO/Hibernate/JPA...... Solutions avec Introspection Java Historique: Origine > 10 ans : Castor, JDO / EJB-CMP Unification : JPA (EJB-3) De-facto standards : Hibernate... Principe Plus de SQL... seulement code POJOs Objets managés Notion de Session (-> Connection + Cache + XA) 10

Vue d'ensemble API ORM, IN/OUT API JPA s.register(obj) obj.set() s.unregister(obj) Impl JPA Cache Map Jdbc+Driver Flush (commit) Session List<Obj> = s.executequery(..) class EMP int id String name DB SQL insert update delete Connection select Mappings Class : Table Obj Field : Table Column Table EMP number id varchar(..) name 11

Implémentation DAO avec JPA public class EmpDAO extends DAO { C R Emp create(emp p) { return session.registerobject(p); } Emp findbyid(emppk id) { return (Emp) session.findbyid(...); } List<Emp> findbyxy(...) { return (List<Emp>) session.executequery(...); } U // update: simply call setter!... emp.seta(..) D void delete(emp p{ session.unregisterobject(p); } 12

APIs de Query Expression traduction en Orienté-Object (AST) de grammaire SQL where clause OQL / EJB-QL... similar to SQL with Objects Exemple: select e from EMP e where e.name =? and e.dept.name =? Deprecated... Query By Example Direct SQL 13

API where clause : AST Expression API très low-level... exemple : Toplink ReadAllQuery q = new ReadAllQuery(Emp.class); ExpressionBuilder b = q.getexpressionbuilder(); Expression e =... Expression expr = b.get( f ).get( g ).equals(b.getparam( v1 )); if (e!= null) e = e.and(expr); else e = expr; b.addargument( v1 ); Vector params = new Vector(); params.add(new Integer(123)); => encapsuler dans API applicative high-level QueryHelper b = new QueryHelper(Emp.class); b.andeq( f.g, 123); 14

Avantage ORM Effets Cachés Manipulation Orientée Objet... simple Code = finder + getter/setter Mapping externalizé (code!= xml, annotation)... MAIS Code SQL = implicite, généré... complexe Effets non compris/prévus au dev Getter =>lazy loading, relation => jointure Setter => pbs XA et caches hardus Rien de magique... comprendre => prévoir 15

Sémantique Relationnel vs Object Inexistant en SQL Hiérarchie de classe (sub-class <-> class) Ordered list, array... Purement SQL Id technique, versioning, audits, trigger... Query, Relation inverse Remarques : généricité ultime... Table Name-Value Bien pour progiciels (plugins)... calvaires DBA 16

Intégration Langage 4GL - DB Relationnel Relation code OO <--> SGBD Relationnel... The Vietnam of Computer science SQL non intégré dans code: Non natif dans Java Sémantique non orientée-objet Alternatives Externalisation String... OK si SQL static extensions Java-SQL (précompilateur?...) Oracle : PL-SQL = langage 3GL procédural + SQL SGBD Orientés-Objets (ex: O2, Versant, Db4j) 17

Plan Introduction Architecture, ORM Accès en Lecture Fonctionnement Relation 1-1 Relation 1-N Relation Héritage Problèmes de Performances Optimisations Modèle, Mapping, Oracle 18

Types de Champs Mappés Champs simples (ValueObject) Type primitif : conversion SQL Java Type user-defined: ex Date, Struct,... Relations Relation 1->1 OneToOne = pointer Relation 1->N OneToMany = Collection / Map Relation N->M ( ManyToMany ) => décomposée en modèle normale : 1-N + N-1 Relation Héritage 19

Introspection, Reflection Reflection = descripteur (meta donnée) Introspection = invocation de champ/method Dualité: obj.setxx(val) <=> xxfield.setvalue(obj, value) Conséquences: outils génériques, Serialisation,... Class Object Field Invoke getvalue / setvalue 20

Mapping Champs Simple read JDBC -> fill Obj Field ResultSet rs =... Object obj =... for(fieldmapping f :...) { switch(f.getmappingtype()) { case SQL_INT: int val = rs.getint(f.getsqlcolindex()); f.setvalue(obj, convert(val)); break... } /*switchtype*/... } /*fieldmapping*/... } /*rs*/ A int f1; Mapping A F1 number 21

Mapping Relation 1-1 Relations loadées indirectement: Proxy load A sql= select a.b_id... from A a where id=? lazy load A->B find B by id (in cache, then in db) sql= select b.*... from B b where id=? A b A BProxy 1 Id obj 0..1 ID B_FK B B ID FK Index(PK) 22

Proxy : Approche Explicite / AOP Approche Intrusive (code Explicite) Ex Toplink: private ValueHolderInterface b = new ValueHolder(); public B getb() { return (B) b.getvalue(); } public void setb(b p) { b.setvalue(p); } Approche Transparente : AOP Remplacement byte-code setter/getter Au Runtime (ClassLoader) Ou Post-Compilation A b BProxy Id obj 23

IdentityMap : Cache by Id Principe: 1 instance d'objet pour 1 type + 1 ID (+ 1 session) == au lieu de.equals() Conséquences: FindById => always resolve in cache Cache by Id = Solution optimale (Map) (1): findbyid in cache A (2): cache miss find in DB (4): return from cache (3): put(resolve) into cache A ID Index(PK) 24

Query No Cache + Resolve Pour TOUTES les Querys!= findbyid => select in DB... without cache + resolve result into cache! (1): findbyxyz : NO cache B (3): return from cache B ID (2): put(resolve) into cache Hibernate : Cache de queries (pas Toplink) Pbs: Invalidations sur updates / mémoire 25

Mapping Relation 1-N Load A : sql = select... from A where id=? Lazy load A->B : find all B by parenta... in db (no cache)! sql = select * from B where A_FK =? A blist 1 ListProxy parenta list 0..* ID B A B ID A_ID FK Index A_ID.. 26

Mapping Relation Héritage Discriminant... = sous-type exact d'un objet Recherche A => retourne des A et des B! un B est un A Pb... plusieurs tables/jointures/queries! A A ID DISCR B B ID Index (PK) FK Index (PK) Contrainte conditionnelle ID+Discr FK 27

Code SQL pour Héritage Step 1 : select distinct(a.discr) from A where <expr> Step 2.. N : query + jointures par type select * from A a, B b where a.id=b.id and <expr> select * from A,B,C where... <expr> etc Adieu Performances... Alternative possible 1 select ids, type + N findbyids : id in (?,?,?...) cf next 28

Plan Introduction, ORM Accès en Lecture Fonctionnement Relation 1-1, 1-N, Héritage Problèmes de performances Optimisations Indexes, Modèle de données, Optimisations Mapping, Caches Optimisations Oracle 29

Outils de Diagnostic Performance Nombreux Outils de Profiling... choisir cibles Meilleur rapport efficacité/coût: jdbc profiling Server App, Jta IDE Code Code Model Fonctionel ORM Jprobe(TM) App metrics, J2EE Profiling OptimizeIt(TM) App log Wily(TM)...... Développeurs Architectes Jdbc IDE SQL Sp6 Oracle Stats Jdbc-logger...... 30 DBAs

Rappel : B*-Tree Index Index = B*-Tree (B=Balanced) / hash / bitmap... Recherche en log(n/k) => ~2-3 logical Ios Leaf doublement chainées => index scan ID F1 F2.. A Index1: F1, F2 F1: varchar F2 : number ( a,1) < ( d, 4)... < ( z,9) ( a,6) <... < ( c,8) (f1,f2,rowid)... (f1,f2,rowid)... K compares per block ( x,5) <... < ( z,9) (f1,f2,rowid) 31...

Index Eligible Query where F1=? And F2=?... and Fn=? Utilisation de k (<=N) 1ères colonnes de l'index Index sur (F1,F2...Fn...) => Eligible Si Manque Fi=? => (reste de l') index inutilisable!! Select * from A where... where F1=? ==> index1 only where F1=? And F2=? ==> index1 or index2 where F4=? ==> no index ID F1 F2.. Fn A Index (PK) Index1: F1, F2 Index2: F2, F1 32

Couverture d'index select Fn+1,... Fp where F1..Fn Colonnes utilisées en lecture au lieu de recherche Ordre indexé indifférent Bonne idée: rajouter ID en dernier Select F2 from A where F1=? == > index 1... avec couverture d'index (no table access A) ID F1 F2.. Fn A Index (PK) Index1: F1, F2..ID Index2: F2, F1..ID 33

Pb de Performance avec Heritage lsb = findby(a_f1, B_F2) sql: select * from A a, B b where a.id =b.id and a.f1 =? and b.f2 =? Pb: sous-indexation séparée de 2 tables = HashJoin A B A ID DISCR F1 B ID F2 Index (PK) FK Index F1...ID Index (PK) Index F2...ID 34

Dénormalisation Mapping 2 Class <-> 1 seule table + columns nullables A B A (AB) ID DISCR F1 F2 Index (PK) Index F1, F2...ID ou Index F2, F1...ID 35

Pb Similaire avec Relation OneToMany lsc = findby(a_f1, C_F3) Sql: select * from A a, C c where c.a_fk = a.id and a.f1 =? and c.f3 =? Pb: sous-indexation séparée de 2 tables A 0..* ID F1 C A Index (PK) Index F1...ID AC ID A_FK F2 FK Index (PK) Index F2...ID 36

Denormalisation: Copy Trigger Trigger to copy A.F1 -> C.COPYAF1, then index on update A.F1 / on Insert C / on Update C.A_FK Pb: changer query, utiliser C.COPYAF1 au lieu de =A.F1 ID F1 solution avancée Materialized Views + Query Rewrite A Index F1... C ID A_FK F2 COPYAF1 Index F2... Index COPYAF1, F2,... 37

Problème Applicatif : N+1 Queries lsa = findby(...); // 1 Query for (A a : als) { b = process(a); // N Queries! 1 per A... c = process(b); } A 0..* 1 x select * from A a where... N x select * from B where... B C 0..* NxP x select * from C where... 38

Problème des N+1 Querys Extrèmement fréquent, voir Omni-présent! Complexité linéaire... quadratique si 2 pbs N+1 en cascade! 1 Traitement => N querys => Timeout query = appel réseau + parse + execute + fetch 15 ms min (~70 ms avg) Stats en Prod ~10M de selects par jours = 100 querys / seconde 39

Solutions au Problème N+1 Refactorer Modèle : Query->Relation => Relations loadées (lazily) 1 seule fois... puis rattachées au cache Mapper les relations OneToOne Ne pas mapper des int mais des pointeurs! Caches + preload (hot data) Batch Reading / Join (?) Machine 4/8 CPUS... use it (don't save it!) 40

Solution au N+1 : Cache By Id lsa = findby(...); // 1 Query // preload corresponding B at startup/on demand // select * from B where... // => put in cache: cacheb.put(bid, b) for (A : als) { B b = a.getb(); // = lazy load B by id = hit cache, in memory... // = cacheb.get(bid) } 41

Relation 1-1 de Référentiel Relations 1-1 très nombreuses Partie référentiel Schéma en Etoile, typique des Datawarehouses Exemple Place Broker Portfolio Instrument Deal TypeDeal Devise 42

Cache Applicatif By Code!= By Id 2 exemples typiques: Table User => findbyname Table translation CodeExtern => findextbysyscode / findcodebysysext Solution Cache Applicatif: Name->Id FindById = in ORM cache FindByName... in App Cache A A ID NAME Name2Id cache miss find ID by Name Index(PK) Index 43

Solutions au N+1 : Batch/Join Reading FAUSSE Bonne Idée : Rajouter une jointure pour éviter une query? Problèmes: parfois pire que mieux execution (repeat where clause ) volume de données (repeat data ) / resolve cache! Où? Jamais pour données de référentiel Exclusivement pour aggrégations fortes Ex: load Curve(s) => load Child Points 44

Explication Batch Reading Proxy remplacé par QueryBatchProxy Remember parent query + group children Lazy-load 1 child = load All Children = exec { repeat parent query + join } Parent Query => load a1...an a1 a2 an QueryHolder Child Query => load b1...bn + reconnect proxy1 b1 proxy2 b2 proxyn bn 45

Fonctionnement QueryBatchProxy lsa = findby(...); // select * from A where... lsa[0].getb(); // use one b... load all B // select B.* from A a, B b where... and a.id=b.a_fk Queries répétées N fois avec 1 + 2 +... + N jointures Cascader BatchReading + Héritage = désastre!! ex: a b c => 3 requètes SQL : 1: select * from A... 2: select A,B... 3: select A,B,C... 46

Plan Introduction, ORM Accès en Lecture Fonctionnement Relation 1-1, 1-N, Héritage Problèmes de performances Optimisations Indexes, Modèle de données Optimisations Mapping, Caches Optimisations Oracle 47

Find By Ids Multiple select * from A where ID in (..,..,.., ) Besoin fréquent: pour N+1, héritage... Problèmes pas de bind variables, hard parse Solution Oracle: select * from A where ID in (select id from table(cast? As T)) OracleArray =... pstmt.setobject(1, oraclearray); 48

Reports: FIRST_ROWS / Rownum Ecrans de recherche Critères facultatifs... => rapide / full table scan Solution 1 : Query Timeout Solution 2 : select /*+FIRST_ROWS*/... Solution 3 : where... rownum < 500 execute query!= consume resultset.next()... cf pb Toplink Solution 3bis: Use rownum paging [first,last] select.. from (select rowum r,.. from... where rownum < last) where r > first 49

Query Reports... Combining Solutions Trop de jointures? a) Select Object + Héritage... jointures b) Select a.name (référentiel?)... jointure c) Critère a.b.c.d =?... jointures Pour a) : select ID from... + findbyids Pour b) : select a.id + cache applicatif Pour c) : split queries... c.d=? / a.b in (...) 50

BindVariable, Soft/Hard Parse Utiliser PreparedStatement + Bind Variables 1ère exécution = Hard-Parse CPU pour Parser + optimizer Plan Stocké dans V$SQLAREA Re-exécution = Soft-Parse Lookup (par text sql) + check + execute Sans BindVariable... performance impossible Spin-locks (=CPU + lock), Cache miss / Mémoire 51

Hard Parse Soft Parse : JDBC Mauvais Exemple: for (int i = 0; i < 1000; i++) { conn.executequery( select * from A where id= + i); } Correct, 2x plus rapide: String sql = select * from A where id =? ; for (int i = 0; i < 1000; i++) { stmt = conn.preparestatement(sql); stmt.setint(1, i); stmt.executequery(); stmt.close(); } 52

Softer-Soft-Parse Softer-Soft-Parse Reuse PreparedStatement, no close => skip lookup, check => only execute + fetch => 2x2 fois plus rapide: stmt = conn.preparestatement( select * from A where id =? ); for (int i = 0; i < 1000; i++) { pstmt.setint(1, i); pstmt.executequery(); } pstmt.close(); // repool in LRU pstmt cache 53

Tuning Soft(er) Parse Si code sans PreparedStmt... Work Around System alter system set CURSOR_SHARING similar... pb induit: pseudo variables pour constantes! => plan d'exécution moins précis Config Serveur Applicatif Pool JDBC > LRU cache Statement Size =... Dans PL-SQL => implicit!!! open+cache cursors... 54

Conclusion Mapping Objet-Relationnels Outils matures, fiables et performants Standards Sémantique Objet vs Base Relationnel Diff (in)évitable... pb performance Principes universels à connaître et maîtriser Pourtant... méconnaissance développeur / DBA 55

Conclusion... A Suivre 1ere partie = accès en lecture, SQL généré, perf... cf 2eme partie = accès en écriture Plan Aspects Transactionnels : JTA, XAResource Fonctionnement ORM - XA Lock Optimiste, Versionning Pattern Read-Mostly (cache niveau 1 / 2) Oracle : Undo/Redo, isolation no-read-lock 56

Questions Questions?? arnaud.nauwynck@gmail.com 57