Mapping Objet Relationnel (ORM) Partie 2 : Principes & Fonctionnement en Ecriture Transactions, Versionning, Session / Cache niveau 2, Locks



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

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)

OpenPaaS Le réseau social d'entreprise

Accès aux bases de données

TP Programmation Java / JDBC / Oracle

Une introduction à la technologie EJB (2/3)

Java et les bases de données

Programmation d application Bases de données avec Java

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

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

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

Projet gestion d'objets dupliqués

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

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

Création d une application JEE

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

Application web de gestion de comptes en banques


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

Java DataBaseConnectivity

C-JDBC. Emmanuel Cecchet INRIA, Projet Sardes.

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

Auto-évaluation Aperçu de l architecture Java EE

JOnAS Day 5.1. Clustering

Gestion des transactions et accès concurrents dans les bases de données relationnelles

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

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

Architecture Orientée Service, JSON et API REST

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

Compte Rendu d intégration d application

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

Introduction aux Machines Virtuelles avec VMKit

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

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

Guide d'installation et de configuration de Pervasive.SQL 7 dans un environnement réseau Microsoft Windows NT

Remote Method Invocation (RMI)

Synchronisation Mysql (Replication)

Paris Airports - Web API Airports Path finding

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

Java Aspect Components (JAC)

Les transactions 1/46. I même en cas de panne logicielle ou matérielle. I Concept de transaction. I Gestion de la concurrence : les solutions

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données

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

Web Tier : déploiement de servlets

Architecture et Extensions d ArcGIS Server

Les bases de données

Développement Web - Object Relational Mapping and Hibernate

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

Implémentation des SGBD

4. Outils pour la synchronisation F. Boyer, Laboratoire Lig

2 Chapitre 1 Introduction

JOnAS 5. Serveur d application d

Bases de données et sites WEB

PHP. Bertrand Estellon. 26 avril Aix-Marseille Université. Bertrand Estellon (AMU) PHP 26 avril / 214

Composants logiciels Exemples : Java Beans, Enterprise Java Beans

Hibernate vs. le Cloud Computing

Projet. But: consultation en temps réel d événements (cours de bourse, trafic d envoi SMS ) sur des téléphones portables. Serveur de diffusion

J2EE. Java2 Enterprise Edition. Pierre Yves Gibello Mise à jour : 30 Septembre 2004

Connexion à SQL Server 2005 à partir du serveur d application SJSAS 9 Utilisation d une interface JDBC

Dis papa, c est quoi un bus logiciel réparti?

RMI le langage Java XII-1 JMF

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

Optimisations des SGBDR. Étude de cas : MySQL

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Modélisation et Gestion des bases de données avec mysql workbench

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

TP Contraintes - Triggers

Notion de base 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

[APPLICATON REPARTIE DE VENTE AUX ENCHERES]

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

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é

LOG4430 : Architecture et conception avancée

Cedric Dumoulin (C) The Java EE 7 Tutorial

Devoir Data WareHouse

Module BDR Master d Informatique (SAR)

COMPOSANTS DE L ARCHITECTURE D UN SGBD. Chapitre 1

Alfstore workflow framework Spécification technique

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Big Data. Cyril Amsellem Consultant avant-vente. 16 juin Talend

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

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

Cours 6. Sécurisation d un SGBD. DBA - M1ASR - Université Evry 1

1. Base de données SQLite

Cours 8 Not Only SQL

IFT3030 Base de données. Chapitre 1 Introduction

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

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

PDO : PHP Data Object 1/13

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Remote Method Invocation en Java (RMI)

Oracle Maximum Availability Architecture

Software Engineering and Middleware A Roadmap

ossier rchitecture echnique

Threads. Threads. USTL routier 1

Java 1.5 : principales nouveautés

Compétences Business Objects

Transcription:

L informatique qui réinvente la finance Mapping Objet Relationnel (ORM) Partie 2 : Principes & Fonctionnement en Ecriture Transactions, Versionning, Session / Cache niveau 2, Locks Arnaud NAUWYNCK arnaud.nauwynck@gmail.com

Plan Rappel partie 1 Architecture, API ORM,... Accès en Ecriture Aspects Transactionnels API JTA, intégration Jdbc + ORM Lock, Versionning, Lock Optimiste Pattern Read-Mostly, Session / Cache Niveau 2 Oracle Undo/Redo, isolation no-read-lock 2

Audience - Prérequis PAS un tutorial hibernate/jpa/ejb... Pré-requis: connaissances SGBD / persistence But: explications avancées Aspects Code => DBA (Java, JPA, Serveur Applicatif...) Aspects SGBD => Développeurs (Optimisations, Index, spécificités Oracle...) 3

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

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

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

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

RAPPEL : Implémentation DAO avec JPA public class EmpDAO extends DAO { // protected Session getsession()... public Emp create(emp p) { C return session.registerobject(p); } public Emp findbyid(emppk id) { R U return (Emp) session.findbyid(emp.class, id); } // update: simply call setter! //... emp.seta(..), emp.addb(..) public void delete(emp p) { D session.remove(p); } 8

Approche Naïve Updates DAO CRUD Connection conn =... PreparedStatement pstmt = null; try { String sql = update EMP + set NAME=?, DEPT=?,... + where ID =? ; pstmt = conn.preparestatement(sql) ; pstmt.setint(1, Tom );... pstmt.setint(10, id); int c = pstmt.executeupdate(); if (c!= 1) throw new RuntimeException(); } finally { safeclose(pstmt); } 9

Problèmatique Updates CRUD 1) Aspects Transactionnels... non spécifiques au CRUD, voir suite XA = ACID 2) Update de tous les champs... peu efficace, et risqué! => besoin d'un update incrémental via champs oldvalue / dirtyflag 3) Déclenchement des appels... juste après chaque setter? => besoin de flusher les changements 1 fois à la fin 4) Problèmes concurrentiels, Isolation, LostUpdate...... besoin de locks / versionning 10

Update (Diff) Incrémental, UOW Diff = After Before After : in Session, UnitOfWork, WorkingCopy Before : as Init / as in Cache / as in DB...?? Objet en base a f1 Unit Of Work Recursive Compare generate JDBC Diff 0 Objet modifié a' f1' (!=f1) Objet créé b' update A set F1=? where ID=? insert B values... Objet délété c 0 delete C where ID =? 11

Client (Stub) Exemple Code Pre-Post pour XA Server EJB (Skeleton) Server Impl Transaction Manager preinvoke() Session begintransaction() Business code beforecompletion postinvoke() flush() committransaction() or rollbacktransaction() 12

Aspect Transactionnel dans JDBC Transaction Manager begintransaction() setautocommit(false) no begin XA (Prepared)Statement setint() setstring()... Connection DataSource ResultSet getint() getstring()... committransaction() or rollbacktransaction() prepare() commit() / rollback() 13

XA = ACID Business Code begintransaction() A = Atomic C = Consistent I = Isolated D = Durable Insert Obj1 Update Obj2 Delete Obj3 committransaction() or rollbacktransaction() 14

Problématique ACID x 3 = SGBD + AppServer + Client-ClusterServer... SGBD begin prepare commit XA enabled? Vraiment ACID?... voir suite (1) 1 App Server + SGBD N App (Cluster) + M SGBD begin Cache Session commit begin Cache Session commit XA via Cache?... voir suite (2) XA via ClusterCache?... voir suite (3) 15

Anomalies ACID d'un SGBD A et I... impossible sauf si Serialized... = mono cpu = non performant, non scalable! En pratique : classification des défauts Dirty read Read committed Read Phantom Read consistent Lost Update Read lock, write lock Dead-lock watchdog... DeadLockVictimException 16

Anomalies ACID d' 1 ORM + SGBD Updates Incrémentales via Session.. via Cache Si Cache FAUX => update FAUX! Cache Session Problèmes Synchronization Cache vs SGBD Setter sur objets du cache => CORRUPTION! Updates directes db => DE-SYNCHRONIZATION! Read XA / Dirty / phantom / Rollback? Commit => commit putobjectsincache XA 17

Anomalies ACID de N Apps + SGBD Problèmes de réplication de N caches Synchrones et XA? Problèmes N Clients-Server(s) LostUpdate, OptimisticLockException... Effet cache via fenètres d'éditions : Server->Client ->... edit... -> Client->Server Client1 Client2 Load Data Save Data1' Load Data... LostUpdate Save Data2' 18

Anomalies ACID de 1 App + N SGBDs N Resources à commiter dans 1 transaction... Ex: 2 bases (transfert argent...), JMS, Mail... => utilisation 2-phases-commit Au plus 1 resource non XA... en général SGBD non XA (optionnel)!!! HeuristicLockException si pb... begin enlist XAResource1 XARes2 XAResourceN prepare Commit /rollback 19

Plan Introduction, Rappel Aspects Transactionnels JTA, intégration JDBC + ORM Versionning, Lock Optimiste Pattern Read-Mostly, Cache Niveau 1 & 2 Oracle Undo/Redo, isolation no-read-lock Lock Base de Données / Oracle 20

JTA : Transaction API Singleton TransactionManager XA rattaché au Thread courant Thread -> XA -> XAResource -> resource Spring : Not invented here syndrome!! TransactionManager Begin XA ThreadLocal Code applicatif a.set()... a.add()... commit XA phase 1 (prepare all resources) commit XA phase 2 (commit all resources) 0..1 Transaction 0..* Synchronization Listener 0..* XARessource 21

Container Managed XA, Démarcation Attributs Transactionnels: annotés sur EJB 1+4 possibilités: Required (le plus courant) Supports... si parent non XA => non XA! Mandatory... couche interne seulement NotSupported... pas XA! RequiresNew... pour log, audit Supports/NotSupported est suspecte... souvent: workaround pour Timeout JTA! 22

Intégration JDBC dans JTA Connection JDBC = XARessource begin tran... implicit! setautocommit(false)... 1 fois init pool setautocommit(true)... suspect prepare() Supports / NotSupported au lieu de Required!... seulement si mode 2-Phases commit (plusieurs bases)! commit() Confusion nommage: Session Oracle = Connection... XA Oracle!= JTA 23

Connection.close()?... commit() code de connection jdbc: toujours try {... } finally { close(); } Connection wrappées!! close()= noop ThreadLocal ConnectionXAResource First use : open+ close = attach to XA/Thread... setautocommit(false)... not really closed! 1 delegate Connection ManagedConn VendorConn re-use : open + close = re-use from XA/Thread... still not closed! commit? delegate connection.commit() + close!!... i.e. repool 24

Intégration ORM dans JTA - XAResource Session = XAResource? Automatiquement démarré + rattaché au XA ordre resource important : flush() jdbc before jdbc commit! Use SynchronizationListener.beforeCompletion() ThreadLocal First use : lazy start Re-use! flush() commit Session 0..* PersistObj XA SynchListener XARessource SessionXAListener? 25

Plan Introduction, Rappel Aspects Transactionnels Versionning, Lock Optimiste Pattern Read-Mostly, Cache Niveau 1 & 2 Oracle Undo/Redo, isolation no-read-lock Lock Base de Données / Oracle 26

Méchanismes de Locks But: locké les objets avants les updates Maintenir la cohérence des groupes d'objets ACID : Atomic, Consistent, Isolated, Durable Code multi-thread safe Ex: lock() try { obj1.set().. obj2.set()... } finally { unlock(); } 27

Lock... Dead-Locks Use Lock => get Dead-Locks... locka lockb waitb waita Code J2E correct: aucun synchronized Code client: inutile Swing = Single Threaded Appartment Model Code Serveur: pool, queue, jms,... déjà codés, EJB/JPA sans locks Pattern Read-Mostly + Lock Optimiste... cf next 28

Lock Optimiste Lock Optimiste = FAUX-AMIS : version pour merge (!= lock) On laisse faire, jusqu'à la base qui gèrera D'où le nom optimiste Versus Lock Pessimiste = lock (classique) exclusif... pour empécher l'avancement Analogie : Subversion (versus SourceSafe) Svn update / svn merge / svn commit 29

Lock Optimiste : Update/Merge/Commit DB=Repository Subversion Ressource to update=file 1: Check- Client 1 out / update =rev1 2: Write (local) =rev1' 3: commit =rev2 Client 2 1: Check-out / update = rev1 2: Write (local) = rev1'' 4: Commit... FAIL... still =rev1'' 5: Update-merge/Mark-merge = rev2' 6: commit = rev3 30

LockOptimiste en JDBC 1) select ID,VERSION,... from T where... 2) update T set VERSION=VERSION+1, A=?, B=?... where ID=? and VERSION=? 3) check update int rowcount = stmt.executeupdate(...) // ou stmt.getupdatecount()) // en Sql: %rowcount If (1!= rowcount) { throw new OptimisticLockException(); 31

Plan Introduction, Rappel Aspects Transactionnels API JTA, Intégration Jdbc + ORM Lock, Versionning, Lock Optimiste Pattern Read-Mostly, Cache Niveau 1 & 2 Oracle Undo/Redo, isolation no-read-lock 32

Design Pattern Read-Mostly But : Lecture SANS lock, sur objet multi-threadé Ecriture, en thread-local (XA) WorkingCopy... reader!= writer OK pour lectures... mais Code dupliqué avec signatures différentes! après writer.set()... writer.get() : correct reader.get() : FAUX Reader Writer 33

Read-Mostly Proxy (Transparent) Proxy = API facade simple Implémentation via reader + writer + writemode WriteMode = état du switch reader/writer Read consistent: re-find => retourne même proxy rattaché au thread (XA) XA (ThreadLocal) p=find(..)... => 1) find in Thread-Local 2) do DAO.find() 3) wrap with Proxy 4) attach to thread-local ReadMostly (Proxy) Id delegate switchwritemode Reader Writer 34

Pattern Read-Mostly Readers Cache multi-threaded objects p=find(..) p.seta(..) In memory clone on first Set + change mode commit => compare Reader/Writer to generate JDBC udpate => put in cache put in cache on commit Writer Session XA thread-local objects 35

Sans Proxy... Clone on Read! Cache niveau 2 Find => clone in memory (clone on read)! p=find(..) + put in session p.seta(..) commit => compare Reader/Writer to generate JDBC udpate => put in cache put in cache on commit Session / UnitOfWork 36

Plan Introduction, Rappel Aspects Transactionnels API JTA, Intégration Jdbc + ORM Lock, Versionning, Lock Optimiste Pattern Read-Mostly, Cache Niveau 1 & 2 Oracle Undo/Redo, isolation no-read-lock 37

Lock SGBD Classiques Read-locks (read consistent) : lock ré-entrant Write-Locks (on update) exclusif, efficace en mémoire, mais problématique... WatchDog = détecte les dead-locks DeadLockVictimException... ok : réessayer 3x!! WatchDog locka lockb waitb waita Detect Dead-lock choose victim kill victim 38

Oracle... NEVER Read-Lock Oracle est différent de la plupart des SGBD! Jamais, Jamais de read-lock... En interne: pattern read-mostly : clone on write pages historique pour regénérer les pages non modifiées relire sans être locké par des writes! Read consistent = read as begin tran Read flashback = as of date = read dans le passé voir page suivante : UNDO Log...symmetric REDO log = journal XA classique 39

Oracle REDO Log Chaque Session ne voit que ses Updates Principe ACID: I=Isolé!... Copy-on-write blocks Redo log = journal xa: Flush on commit DBWriter: sauvegarde pages asynchrone REDO log files page1 page2 RedoLog>> Jdbc conn1 Update... set X=? where ID=? Page1' session1 <<UndoLog AsyncWriter DB files 40

Oracle Reads : UNDO Log Read Consistent = Lecture répétable, sans lock Mieux encore: comme au début de la transaction UNDO Log : pour re-générer les pages Read Flashback (read in past) Jdbc conn1 select... where ID=? Page1 page2 RedoLog>> Page1' <<UndoLog 41

Conséquence des Read Consistent Attention SQL correct en Sybase... dead-lock = buggué dans Oracle... sans lock Ex: calcul de débit/crédit... 0 +1 +1 = 1!! Select A... => 0 Update... set A=A+1... => 1 NO lock Select A... => 0 Read consistent même après commit Commit => 1 NO Read commited update... set A=A+1... => 1 Commit => 1 42

Pseudo Lock-Optimiste en Base Ni Oracle, Ni ReadMostly ne lockent vraiment... check version minimaliste OK pour les saisies utilisateurs...pas suffisant pour le pb 0+1+1 = 1!! Client Thread1 Thread2 Select A... => VERSION=1 Write (local) transmit VERSION=1 (begin XA..) Update A set..., VERSION=2 where ID=? And VERSION=1 if (%ROWCOUNT!=1) throw new OptimisticLockEx Commit 43

Conclusion Principes universels à connaître et maîtriser Transaction ACID, JTA, XAResource ReadMostly : Session : Niveau 1 / Cache : Niveau 2 OptimisticLock... Niveau 3 Combinaison des 3 solutions = Outils matures, fiables et performants Standards Pourtant... méconnaissance développeurs / DBAs 44

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