06 Java EE Persistance

download 06 Java EE Persistance

of 12

Transcript of 06 Java EE Persistance

  • 8/2/2019 06 Java EE Persistance

    1/12

    07/01/2011

    1

    JEE (J2EE) & Les applicationsweb

    Persistance des donnes

    ABDELTIF ELBYED

    [email protected]

    Plan

    1. Les services de persistance

    Mapping objet/relationnel Bases Objet

    2. JDBC

    3. EJB

    4. Hibernate

    Persistance des donnes

    La persistance des donnes dsigne le fait que ces dernires(les donnes) doivent exister mme aprs larrt du serveurJEE et au-del de la dure de lexploitation de lapplication

    Il faut sauvegarder ltat courant des donnes manipulespar une application Donnes transcientes dans les programmes (tableaux, chaines de

    caractres, etc.)

    Utilisation ncessaire de base de donnes pour sauvegarder lesdonnes

    Diffrents types de bases de donnes SGBDR (relationnels) : Oracle, PostgreSQL, etc.

    SGBDO (objets) : Versant, O2, etc.

    XML : EDI (Echange de D onnes Informatises)

    Fichiers : Tableurs, fichiers texte, etc.

    Problmatique

    Lutilisation de bases de donnes objet nest pas encoreun choix pour les entreprises donnes existantes et vitales

    mauvaise image des SGBD objet il existe des solutions hybrides : Oracle 8 par exemple

    Actuellement, lutilisation des SGBD relationnels estincontournable dans les SI

    Comment rendre persistants des objets dans une base

    de donnes relationnelle ? adopter une stratgie pour choisir entre plusieurs solutions de

    mise en correspondance objet-relationnel

    effectuer des compromis entre puret dun modle etperformance

    Contraintes

    Objet = donnes (attributs) + comportement (mthodes)

    Enregistrement = donnes

    Les relations entre objets sont de diffrentes natures composition

    hritage

    Un modle objet est plus informatif quun modlerelationnel le passage objet vers relationnel ncessite de faire un choix parmi

    plusieurs solutions

    le passage relationnel vers objet nest pas souvent pertinent car

    le modle objet rsultant est trs pauvre et dnatur

    les objets identifis nont pas de comportement

    Limpdance mismatch

    De nombreuses questions se posent :

    Comment convertir le rsultat dune requte SQL en objetsJAVA?

    Comment rpercuter les modifications de ltat dun objetJAVA mapp?

    Comment modliser les relations entre objets dans labase?

    Comment modliser lhritage des objets dans la base?

    Comment modliser les objets dont les donnes sontrparties dans plusieurs tables?

    Quelle stratgie de cache utiliser pour viter des appelsrpts la base?

  • 8/2/2019 06 Java EE Persistance

    2/12

    07/01/2011

    2

    Les solutions de Persistance

    Lapproche JDBC (API, Design Pattern DAO)

    LAPI et les types de drivers JDBC Framework iBatis

    Lapproche composant Les EJB Entity

    Les solutions de mapping Objet/Relationnel Open Source : Hibernate, OJB

    Commerciales : TopLink, CocoBase

    Lapproche standard JDO Open Source : JORM, TJDO, XORM, RI (Rfrence Implmentation)

    Commerciales : JDO (Libelis, SolarMetric)

    Lapproche full Object Base de donnes objet

    Architecture de rfrence

    Prsentation Modle Persistance

    JSF

    Struts

    Struts Shale

    Servlets/JSP

    Applicationsclientes

    EJB

    SPRING

    JavaBean

    DAO, JDBC

    EJB

    Hibernate

    Toplink

    Connecteurs

    Data-Access Objects Pattern

    Permet de rester indpendant du type de la source dedonnes (SGBDR, Base Objets, Systme de fichiers)

    Joue le rle dadaptateur entre le client et la source dedonnes

    La stratgie daccs aux donnes ne doit pas dterminer lamodlisation des objets mtiers

    Possibilit de changer la stratgie daccs aux donnes sansrcrire le code mtier

    Approche lgre base sur le choix des bons Design Patterns

    Le mapping Objet/Relationnel

    Les avantages : Gain de productivit : vite lcriture de code bas niveau

    Gain de performance : cache

    Les inconvnients : Dans certains cas, les descripteurs de dploiement peuvent devenir

    trs complexes

    Prconis dans le cadre OLTP (On-Line Transaction Processing) sur des petits volumes de

    donnes

    Dconseill dans le cadre OLAP (On-Line Analytic Processing) sur des grands volumes de

    donnes

    Les bases de donnes objets

    Extension de la machine virtuelle JAVA

    Les instances sont stockes dans la base Avec leur champs

    Les rfrences des objets sont galement stockes sous forme dobjetdans la base

    Langage de requtage OQL

    Avantages : Annule la problmatique de limpdance mismatch

    Trs bonnes performances pour les parcours de graphes dobjets

    Opportunits apportes par JDO

    Inconvnients : March de niche

    Gestion des traitements Batch

    EJB: Enterprise Java Bean

    Modle de composants mtiers, connu surtout dansle domaine de la persistance dobjets

    La gestion de la persistance peut tre prise encharge par le bean lui mme (Bean Managed Persitence ou BMP)

    le conteneur d'EJB (Container Managed Persistence ouCMP)

    Inconvnients : Connu pour sa lourdeur

    Difficile maintenir

    Amlioration avec les EJB 3

  • 8/2/2019 06 Java EE Persistance

    3/12

    07/01/2011

    3

    JDO: Java Data Object

    JDO est une spcification de Sun

    Version 1.0 a vu le jour en 2002 JDO a atteint une certaine maturit avec la version 2.0 en mars 2005

    Depuis, JDO volue et devient un standard dans les solutions degestion de la persistance en Java

    Nombreuses implmentations existantes : JPox ( implmentation derfrence de JDO), Castor JDO, etc.

    Avantages Possibilit de persister les donnes vers tout type de systmes de

    gestion de ressources (SGBDR, Systme de fichiers, etc.) La liaison avec la cible sera faite au dploiement de lapplication

    Modlisation objet sans contrainte Supporte lhritage, les collections, etc

    Gestion automatique du mapping des donnes

    Prise en compte des transactions

    Plan

    1. Les services de persistance

    2. JDBC3. EJB

    4. Hibernate

    Dfinition

    Java DataBase Connectivity Specification API Java pour accder aux SGBDR (Systme de Gestion de Bases de

    Donnes Relationnelles BD : ensemble de tables organises pour stocker des donnes qui

    peuvent tre manipules par une ou plusieurs applications

    Avantages Possibilit de changer de drivers sans modifier le code en cas de

    changement de SGBDR Lors du passage du SGBDR MySQL vers le SGBDR PostegreSQL par

    exemple Avec JDBC, il suffit de changer de driver et dutiliser celui adapt

    PostgreSQL Avec PHP, il faut recoder lapplication car les mthodes invoques

    sont spcifiques un SGBDR (mysql_connect(), mysql_close(),etc.)

    Possibilit de se connecter plusieurs SGBDR en mme temps Bibliothques reposant sur SQL

    Possibilit de slections, de jointures, de transactions, etc.

    Dfinition

    Version 3.0 fournie dans Java SE 6 Un programme crit avec JDBC envoie des requtes un

    SGBDR et exploite le rsultat de ces requtes en Java. Objets et mthodes pour interagir avec les bases de donnes

    (langage SQL) Package java.sql Package javax.sql

    Quatre composants majeurs pilotes (ou drivers)

    connexions requte (Statement) ensemble rsultat (ResultSet)

    tapes pour la mise en uvre

    1. Chargement du pilote

    2. Connexion la base de donnes

    3. Cration de la requte

    4. Envoi de la requte

    5. Rception dun ensemble rsultat

    6. Extraction des donnes de lensemble rsultat

    Chargement du pilote

    Spcification du pilote charger

    charge la classe dans la machine virtuelle

    enregistre le pi lote dans le DriverManager

    Ncessaire une seule fois par JVM

    fait gnralement dans une mthode dinitialisation

    Plusieurs pilotes peuvent tre chargs en mmetemps

    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

    1 -Chargement du pilote

    2 - Connexion la base de donnes

    3 - Cration de la requte

    4 - Envoi de la requte5 -Rce ption dun ensemble rsultat

    6 - Extraction des donnes

  • 8/2/2019 06 Java EE Persistance

    4/12

    07/01/2011

    4

    Types de pilote JDBC (1/2)

    Type 1 : Pont JDBC-ODBC traduit les appels lAPI JDBC en

    appels lAPI ODBC

    Open DataBase Connectivitypermet la communication entre clients pour bases de

    donnes sous Windows et SGBD du march.

    Type 2 : API native

    traduit les appels lAPI JDBC en appels lAPI native de la base de donnes

    Type 3 : protocole rseau

    traduit les appels lAPI JDBC en appels un protocole rseau indpendant desSGBD

    Type 4 : full JAVA

    traduit les appels lAPI JDBC en appels un protocole rseau natif li au SGBD

    Si lapplication doit tre installe sur plusieurs plates-forme, il est indispensabledutiliser un pilote de type 4

    1 - Chargement du pilote

    2 - Connexion la base de donnes

    3 - Cration de la requte

    4 - Envoi de la requte

    5 - Rception dun ensemble rsultat

    6 - Extraction des donnes

    Types de pilote JDBC (2/2)

    Les pilotes de type 1 et 2 introduisent une couche intermdiairede communication entre la couche JDBC et la base de donnes Prjudice lefficacit et aux performances de lapplication

    On utilise souvent des pilotes de type 3 ou 4

    Les pilotes de types 3 et 4 sont quivalent en termes deperformance

    1 -Cha rgement du pilote

    2 - Connexion la base de donnes

    3 - Cration de la requte

    4 - Envoi de la requte

    5 -Rc eption dun ensemble rsultat

    6 - Extraction des donnes

    Connexion la base de donnes (1/2)

    Identification de la base par une URLjdbc:subprotocol:subname

    subprotocol : nom du pilote (mysql, db2, oracle, etc.)

    subname : nom de la base (SAMPLE, etc.)

    Exemplejdbc:db2:sample

    Pour une base distante :jdbc:db2://mon_hote:port/sample

    1 - Chargement du pilote

    2 - Connexion la base de donnes

    3 - Cration de la requte

    4 - Envoi de la requte

    5 - Rception dun ensemble rsultat

    6 - Extraction des donnes

    Connexion la base dedonnes (2/2)

    La classe DriverManager est responsable de la gestion despilotes JDBC

    Le gestionnaire de pilotes DriverManager cherche un piloteenregistr pouvant traiter lURL utilisateur (optionnel) : identifiant de lutilisateur

    motDePasse (optionnel) : mot de passe utilisateur

    Il demande une connexion au pilote trouv et la retourne auprogramme appelant

    Une connexion reprsente une session avec une base dedonnes quil faudra fermer ds lors qu'elle nest plusutilise

    String url = "jdbc:odbc:base";Connection conn = DriverManager.getConnection(url, utilisateur, motDePasse);

    1 - Chargement du pilote

    2 - Connexion la base de donnes

    3 - Cration de la requte

    4 - Envoi de la requte

    5 - Rception dun ensemble rsultat

    6 - Extraction des donnes

    Conn.close();

    Exemple de connexion

    import java.sql.*

    public void doGet(){

    try{//Chargement du piloteClass.forName("com.ibm.db2.jdbc.app.DB2Driver");System.out.println("Pilote DB2 JDBC charg");

    } catch (ClassNotFoundException e){e.printStackTrace();System.out.println("Erreur lors du chargement du Pilote DB2");}

    try{// Creation de la connexionString url = "jdbc:db2:sample";Connection conn = DriverManager.getConnection(url,"user", "password");

    System.out.println("Connexion oprationnelle");

    } catch (SQLException e){

    e.printStackTrace();

    System.out.println("Erreur lors de ltablissement de la connexion");

    }}

    1 - Chargement du pilote

    2 - Connexion la base de donnes

    3 - Cration de la requte

    4 - Envoi de la requte5 -Rc eption dun ensemble rsultat

    6 - Extraction des donnes

    Support des transactions (1/3)

    Toutes les connexions JDBC sont rgles en modeauto-commit

    chaque requte est excute dans une transaction spare

    Pour crer une transaction comprenant plusieursrequtes, dsactiver le mode auto-commit

    Connection.setAutoCommit(false)

    1 - Chargement du pilote

    2 - Connexion la base de donnes

    3 - Cration de la requte

    4 - Envoi de la requte5 - Rception dun ensemble rsultat

    6 - Extraction des donnes

  • 8/2/2019 06 Java EE Persistance

    5/12

    07/01/2011

    5

    Support des transactions (2/3)

    Valider une transaction

    Connection.commit()

    Annuler une transaction

    Connection.rollback()

    1 - Chargement du pilote

    2 - Connexion la base de donnes

    3 - Cration de la requte

    4 - Envoi de la requte

    5 -Rc eption dun ensemble rsultat

    6 - Extraction des donnes

    Support des transactions (3/3)

    Exemple

    //Chargement du piloteconn = DriverManager.getConnection("jdbc:db2:SAMPLE");

    // Dsactiver le mode Auto-Commitconn.setAutoCommit(false);

    // Dbut dune nouvelle transaction ... // Excution de requtes SQLif (condition) {// Fin de transactionconn.commit();} else {// Fin de la transactionconn.rollback();}// Une nouvelle transaction commence

    1 - Chargement du pilote

    2 - Connexion la base de donnes

    3 - Cration de la requte

    4 - Envoi de la requte

    5 - Rception dun ensemble rsultat

    6 - Extraction des donnes

    Cration de la requte

    Crer un objet Statement

    permet dexcuter une requte SQL

    Par la suite, la ressource devra tre libre

    Statement stmt = aConnection.createStatement();

    1 - Chargement du pilote

    2 - Connexion la base de donnes

    3 - Cration de la requte

    4 - Envoi de la requte

    5 -Rc eption dun ensemble rsultat

    6 - Extraction des donnes

    stmt.close();

    Envoi de la requte

    Langage SQL

    Requtes de type SELECT

    executeQuery(requteSQL)

    retourne un objet ResultSet

    Requtes de type INSERT, UPDATE ou DELETE

    executeUpdate(requteSQL)

    retourne le nombre de lignes affectes ou 0

    1 - Chargement du pilote

    2 - Connexion la base de donnes

    3 - Cration de la requte

    4 - Envoi de la requte

    5 - Rception dun ensemble rsultat

    6 - Extraction des donnes

    Exemple de requte

    //Chargement du pilote et ouverture de la connexionClass.forName("com.ibm.db2.jdbc.app.DB2Driver");String url = "jdbc:db2:sample";Connection conn =DriverManager.getConnection(url,"admin", "azerty");

    // Creation de la requete et executionStatement requete = conn.createStatement();ResultSet resultat =requete.executeQuery("SELECT lastName FROM EMPLOYEE");

    1 - Chargement du pilote

    2 - Connexion la base de donnes

    3 - Cration de la requte

    4 - Envoi de la requte5 - Rception dun ensemble rsultat

    6 - Extraction des donnes

    Type de requte :PreparedStatement (1/3)

    Linterface PreparedStamement hrite deStatement

    Excution dune requte SQL pr-compile vialinstanciation dun objet PreparedStatement

    quand lobjet est cr, la requte SQL est envoye pourtre compile

    le rsultat est stock pour pouvoir rpondre une ouplusieurs mthodes de type execute()

    amliore les performances : permet lexcution de lamme requte plusieurs fois

    passage de paramtres IN la requte

    1 - Chargement du pilote

    2 - Connexion la base de donnes

    3 - Cration de la requte

    4 - Envoi de la requte5 - Rception dun ensemble rsultat

    6 - Extraction des donnes

  • 8/2/2019 06 Java EE Persistance

    6/12

    07/01/2011

    6

    Type de requte :PreparedStatement (2/3)

    Paramtres de la requte reprsents par des ? dans la requte SQL

    numrots partir de 1 dans le sens de la lecture

    valeurs dfinie par des mutateurs : set(position,)

    String sql="SELECT lastName from EMPLOYEE WHERE SALARY > ? AND BONUS < ?";

    PreparedStatement prepStmt = aConnection.prepareStatement(sql);

    1 - Chargement du pilote

    2 - Connexion la base de donnes

    3 - Cration de la requte

    4 - Envoi de la requte

    5 - Rception dun ensemble rsultat

    6 - Extraction des donnes

    Type de requte :PreparedStatement (3/3)

    Exemple

    //Chargement du pilote et ouverture de la connexionClass.forName("com.ibm.db2.jdbc.app.DB2Driver");String url = "jdbc:db2:sample";Connection conn =DriverManager.getConnection(url,"admin", "azerty");

    // Creation de la requete :// Selectionne tous les employs qui ont// un salaire > 20000 et une prime < 3000PreparedStatement requete =conn.prepareStatement("SELECT lastName FROM EMPLOYEE WHERE SALARY > ?AND BONUS < ?");requete.setFloat(1, 20000f);requete.setFloat(2, 3000f);

    // Excution de la requteResultSet resultat =requete.executeQuery();

    1 - Chargement du pilote

    2 - Connexion la base de donnes

    3 - Cration de la requte

    4 - Envoi de la requte

    5 - Rception dun ensemble rsultat

    6 - Extraction des donnes

    Type de requte :CallableStatement (1/3)

    Excution de procdures SQL enregistres vialinstanciation dun objet CallableStatement, sous-classe de PreparedStatement

    quand lobjet est cr, la requte dappel (call) est envoyepour tre compile

    le rsultat est stock pour pouvoir rpondre une ouplusieurs mthodes de type execute

    encore plus rapide que PreparedStatement

    passage de paramtres IN et OUT

    1 - Chargement du pilote

    2 - Connexion la base de donnes

    3 - Cration de la requte

    4 - Envoi de la requte

    5 - Rception dun ensemble rsultat

    6 - Extraction des donnes

    Type de requte :CallableStatement (2/3)

    Paramtres de la requte

    reprsents par des ? dans la requte SQL

    IN valeur dfinie par des mutateur : set(position, )

    OUT enregistrs via la mthode registerOutputParameter

    valeur rcuprable par des accesseurs :

    get

    CallableStatement callStmt =aConnection.prepareCall("CALL GetNouveauSalaire(?, ?)");

    1 - Chargement du pilote

    2 - Connexion la base de donnes

    3 - Cration de la requte

    4 - Envoi de la requte

    5 - Rception dun ensemble rsultat

    6 - Extraction des donnes

    Type de requte :CallableStatement (3/3)

    Exemple

    //Chargement du pilote et ouverture de la connexionClass.forName("COM.ibm.db2.jdbc.app.DB2Driver");String url = "jdbc:db2:sample";Connection conn =DriverManager.getConnection(url,"admin", "azerty");

    // Calcule, mets a jour et recupere le nouveau salaire// Appelle GetNouveauSalaire(nom, salaire)// nom est un paramtre IN, salaire est un paramtre OUTCallableStatement requete =conn.prepareCall("Call GetNouveauSalaire(?, ?)");requete.setString(1,"Henri");requete.registerOutputParameter(2, java.sql.Types.DECIMAL, 0);

    // Excution de la requte et rcupration de la valeurrequete.executeUpdate();BigDecimal nouveauSalaire = requete.getBigDecimal(2);

    1 - Chargement du pilote

    2 - Connexion la base de donnes

    3 - Cration de la requte

    4 - Envoi de la requte5 - Rception dun ensemble rsultat

    6 - Extraction des donnes

    Extraction des donnes (1/3)

    Parcours de lobjet ResultSet

    table de donnes

    curseur pointant sur la range en cours

    initialement, le curseur est plac avant la premire range

    la mthode next() permet de passer la range suivante retourne false sil ny a plus de range

    1 - Chargement du pilote

    2 - Connexion la base de donnes

    3 - Cration de la requte

    4 - Envoi de la requte5 - Rception dun ensemble rsultat

    6 -Extractio n des donnes

  • 8/2/2019 06 Java EE Persistance

    7/12

    07/01/2011

    7

    Extraction des donnes (2/3)

    Mthode Descript ion

    next() Permetde passer la ligne suivante de ResultSet

    previous() Permetde passer la ligne prcdente de ResultSet

    first() Permetde se positionner sur la premire ligne

    last() Permetde se positionner sur la dernire ligne

    beforeFirst() Permet de se positionner avantla premire ligne

    afterLast() Permet de se positionner aprs la dernire ligne

    isFirst/

    isBeforeFirs

    t

    Retourne si le positionnementest /avant la premire ligne

    isLast/

    isAfterLast

    Retourne si le positionnementest /aprs la dernire ligne

    absolute(index) Permet de se positionner lindex pass en paramtre

    Close Permetde fermer le ResultSet

    Mthodes de linterface ResultSet

    1 - Chargement du pilote

    2 - Connexion la base de donnes

    3 - Cration de la requte

    4 - Envoi de la requte

    5 -Rc eption dun ensemble rsultat

    6 -Extraction des donnes

    Extraction des donnes (3/3)

    Le ResultSet permet de rcuprer les colonnes de larange courante

    en utilisant le nom ou lindex de la colonne

    Les mthodes sont de la forme

    get(int)

    get(String)

    exemple : String getString("prenom")

    1 - Chargement du pilote

    2 - Connexion la base de donnes

    3 - Cration de la requte

    4 - Envoi de la requte

    5 - Rception dun ensemble rsultat

    6 -Extractio n des donnes

    Exemple dextraction de donnes

    //Chargement du pilote et ouverture de la connexionClass.forName("com.ibm.db2.jdbc.app.DB2Driver");String url = "jdbc:db2:sample";Connection conn = DriverManager.getConnection(url,"admin", "azerty");

    // Creation de la requete et executionStatement requete = conn.createStatement();ResultSet resultat = requete.executeQuery("SELECT * FROM EMPLOYEE");

    // Parcours de lensemble rsultat et affichage

    while (resultat.next()) {System.out.println(resultat.getString("prenom"));System.out.println(resultat.getDate("date"));}

    // Libration des ressourcesresultat.close();requete.close();conn.close();

    1 - Chargement du pilote

    2 - Connexion la base de donnes

    3 - Cration de la requte

    4 - Envoi de la requte

    5 -Rc eption dun ensemble rsultat

    6 -Extraction des donnes

    Correspondance des types

    SQL Java SQL Java

    CHAR

    VARCHAR

    LONGVARCHAR

    NUMERIC

    DECIMAL

    BIT

    TINYINT

    SMALLINT

    INTEGER

    BIGINT

    String

    String

    String

    java.math.BigDecimal

    java.math.BigDecimal

    Boolean

    Byte

    Short

    Int

    long

    REAL

    FLOAT

    DOUBLE

    BINARY

    VARBINARY

    LONGVARBINARY

    DATE

    TIME

    TIMESTAMP

    float

    Double

    Double

    byte[]

    byte[]

    byte[]

    java.sql.Date

    java.sql.Time

    java.sql.Timestamp

    Gestion des exceptions

    La plupart des mthodes cites peuvent dclencher uneSQLException doit tre capture lintrieur dun bloc try/catch

    volontairement non traite dans les exemples pour plus de clart

    try {}

    catch (SQLException e) {// traitement de lexception}

    Exemple dextraction de donnes avec gestion desexceptions (1/2)

    import java.sql.*

    public void doGet(){Connection conn = null;try{

    //Chargement du piloteClass.forName("com.ibm.db2.jdbc.app.DB2Driver");System.out.println("Pilote DB2 JDBC charg");

    } catch (ClassNotFoundException e){e.printStackTrace();System.out.println("Erreur lors du chargement du Pilote DB2");}

    try{// Creation de la connexionString url = "jdbc:db2:sample";Connection conn = DriverManager.getConnection(url,"user", "password");

    System.out.println("Connexion oprationnelle");

    // Creation de la requete et execution

    Statement requete = conn.createStatement();

    ResultSet resultat = requete.executeQuery("SELECT * FROM EMPLOYEE");

  • 8/2/2019 06 Java EE Persistance

    8/12

    07/01/2011

    8

    Exemple dextraction de donnes avec gestion desexceptions (2/2)

    // Parcours de lensemble rsultat et affichagewhile (resultat.next()){

    System.out.println(resultat.getString("prenom"));

    System.out.println(resultat.getDate("date"));

    }

    } catch (SQLException e){

    e.printStackTrace();

    System.out.println("Erreur lors de ltablissement de la connexion");

    }

    // Libration des ressources

    try{

    resultat.close();

    requete.close();

    conn.close();

    } catch (SQLException e){

    e.printStackTrace();

    System.out.println("Erreur lors de la libration des ressources");

    }

    }

    NB : La libration des ressources seffectue toujours dans lordre inverse de cration

    Gestion des exceptions

    Erreur de programmation mme si le code est fonctionnel Si une exception est lance par la mthode getConnexion ou par un

    Statement ou un ResultSet, le code correspondant la libration desressources ne sera pas dclench

    Pour faire en sorte que toutes les ressources soient libresquil y est exception ou non, il faut mettre le code delibration dans le bloc finally de la structuretry/catch/finally

    Exemple dextraction de donnes avec gestiondes exceptions modifi

    try{

    // Creation de la connexion

    String url = "jdbc:db2:sample";

    Connection conn = DriverManager.getConnection(url,"user", "password");

    System.out.println("Connexion oprationnelle");

    // Creation de la requete et execution

    Statement requete = conn.createStatement();

    } catch (SQLException e){

    e.printStackTrace();

    System.out.println("Erreur lors de ltablissement de la connexion");

    }

    finally{

    // Libration des ressources

    try{resultat.close();

    requete.close();

    conn.close();

    } catch (SQLException e){

    e.printStackTrace();

    System.out.println("Erreur lors de la libration des ressources");

    }

    }

    Gestion des exceptions

    Autre erreur de programmation mme si le code estfonctionnel Si une exception est lance par resultat.close() par exemple, le code

    correspondant la fermeture de la requte et la fermeture de laconnexion ne sera pas dclench

    Erreur courante mme avec des dveloppeurs confirms

    Pour faire en sorte que toutes les ressources soient libres,il faut entourer chaque fermeture dun bloc try/catch

    Exemple dextraction de donnes avec gestion desexceptions corrig

    try{

    } catch (SQLException e){

    }

    finally{

    // Libration des ressourcesif(resultat!=null) {

    try{resultat.close();

    } catch (SQLException e){

    e.printStackTrace();}

    }

    if(requete!=null) {

    try{

    requete.close();

    } catch (SQLException e){

    e.printStackTrace(); }

    }

    if(conn!=null) {

    try{

    conn.close();

    } catch (SQLException e){

    e.printStackTrace(); }

    }

    }

    Gestion des exceptions

    Code correct et fonctionnel mais programmation longue etlourde

    Possibilit dutiliser une classe statique qui servira fermerles connexions Pas besoin dinstanciation, on utilise directement le nom de la classe

    Pas besoin de constructeur dans la classe statique

  • 8/2/2019 06 Java EE Persistance

    9/12

    07/01/2011

    9

    Exemple dextraction de donnes avec gestion desexceptions amlior (1/2)

    import java.sql.Connexion;import java.sql.Statement;import java.sql.ResultSet;

    public class OutilsFermetureBD{

    // Fermeture dun ResultSetpublic static void fermerConnexion(ResultSet resultat){

    if(resultat!=null) {try{

    resultat.close();} catch (SQLException e){

    e.printStackTrace();}}

    }

    // Fermeture dun Statementpublic static void fermerConnexion(Statement stat){

    if(stat!=null) {try{

    stat.close();} catch (SQLException e){

    e.printStackTrace(); }}

    }

    Exemple dextraction de donnes avec gestion desexceptions amlior (2/2)

    // Fermeture dune connexion

    public static void fermerConnexion(Connexion conn)

    {if(conn!=null) {

    try{

    conn.close();

    } catch (SQLException e){

    e.printStackTrace(); }

    }

    }

    }

    try{

    } catch (SQLException e){}

    finally{

    // Libration des ressources

    OutilsFermetureBD.fermerConnexion(resultat);

    OutilsFermetureBD.fermerConnexion(requete);

    OutilsFermetureBD.fermerConnexion(conn);}

    Code dutilisation de la classe

    Performances avec JDBC

    Laccs aux bases de donnes constitue souvent un gouletdtranglement dans une application

    Lefficacit de JDBC sera accrue par lutilisation des bons pilotes

    la limitation du nombre des requtes au strict minimum

    lutilisation de PreparedStatement et de CallableStatement lorsque

    cest appropri La minimisation du trafic avec la base

    HIBERNATE

    A. ELBYED - JEE 52

    Pourquoi utiliser des framework de persistance ?

    Lutilisation directe de JDBC prsente de nombreuses limites Adhrence dans le code aux noms des Schmas, des Tables, des

    colonnes

    Rptitivit de lcriture des requtes SQL qui doivent toutes trecrites

    volution et maintient du code difficile

    Pas de fonctionnalit haut niveau (ex: liens entre enregistrements,chargement la demande, hritage, )

    Problmes doptimisation (exemple: nombre de requtes sur lestransactions longues)

    Lide Dfinir une fois pour toutes la correspondance entre le monde objet et

    le monde relationnel puis laisser le framework gnrer lui mme lesrequtes SQL (INSERT, DELETE, SELECT, UPDATE)

    Cette correspondance se nomme mapping Objet/Relationnel

    Plan

    1. Les services de persistance

    2. JDBC

    3. EJB

    4. Hibernate

  • 8/2/2019 06 Java EE Persistance

    10/12

    07/01/2011

    10

    La norme EJB

    Base de donnes

    Prsentation

    Mtier

    Persistance

    La norme EJB

    Les EJBs sont des composants Java qui rsident dans

    le container EJB des serveur dapplication J2EE

    Les EJBs sont des composants Distribus (accessibles distance, ex: RMI)

    Portables

    Persistants

    Transactionnels

    La dernire version des EJB est la version mise disposition depuis le 10/12/2009

    EJB : Entreprise JavaBean

    ServeurClient

    Browser

    Serveur 1

    ServeurHTTP

    JVM

    HTTP

    HTML Moteur deservlets

    ServletsetJSP

    RMI

    RMI

    Serveur 3JDBC

    JVM

    Container

    EJBEJB

    EJB

    Serveur 2

    JDBC

    JVM

    Container

    EJBEJB

    EJB

    La notion de composant

    Les composants sont des morceaux de programmedvelopps et dploys de faon indpendante etqui prsentent une interface permettant leurassemblage

    analogie avec llectronique, notion de bote noire

    La spcification EJB dtaille comment implmenterces composants

    Objectifs des EJBs

    Permettre aux dveloppeurs de se focaliser sur lalogique mtier sans avoir se proccuper desproblmes lis aux architectures distribues : Gestion des communications rseaux Gestion du multi-threading et des accs concurrents Gestion des transactions Gestion de la persistance

    Offrir une solution standard indpendante des OS et des fournisseurs de serveur

    dapplications

    Couvrir les phases de dveloppement, dploiement etexploitation

    Les diffrents types dEJB

    Trois utilisations diffrentes de composants lapplication cliente accde la logique mtier rsidant sur le

    serveur

    lapplication cliente manipule un objet mtier reprsentant desdonnes persistantes

    lapplication cliente dpose une demande de traitementasynchrone. Ce traitement sera ralis par un rcepteurasynchrone.

    Trois types dEJB pour rpondre ces besoins Session Bean

    Entity Bean

    Message Driven Bean

  • 8/2/2019 06 Java EE Persistance

    11/12

    07/01/2011

    11

    Prsentation des EJB Session

    Reprsente une communication avec un client

    Est accd par un seul client la fois Peut tre vu comme une extension du client dans certains

    cas

    Manipule gnralement des objets mtier persists

    Peut participer une transaction, mais son tat nest pastransactionnel

    Deux types : Sans tat (Stateless)

    Avec tat (Stateful)

    Architecture base dEJB Session

    ClientClient

    Autresystme

    Etat de lasession

    Session Bean

    Container EJB

    SGBD

    Prsentation des EJB Entits

    Reprsente des donnes persistantes ex : une entre dans une table dun SGBDR

    Le bean reprsente une entit mtier (clients, commandes,etc.) et non pas une procdure. Ex : CommandEJB serait un bean entit, mais CommandVerifierEJB

    serait un bean session.

    A une dure de vie indpendante du serveur dEJB les donnes en base permettent de reconstruire lEJB mme si

    linstance du bean sest termine ou que le serveur dEJB est arrt

    Gr de faon transactionnelle Deux types : BMP (Bean Managed Persistence) CMP (Container Managed Persistence)

    Concurrent des frameworks de persistance exemple: Hibernate

    EJB Session et EJB Entits

    ClientClient

    Container EJB

    Entity Bean SGBD

    Architecture base dEJB Entits

    ClientClient

    Container EJB

    Entity Bean SGBD

    Etat de lasession

    Session Bean

    Prsentation des Message Driven Bean

    Un Message Bean est un bean qui peut tre activ par unmessage provenant dun middleware orient message (ex :MQSeries) Rcepteur asynchrone suite lenvoi dun message sur une file

    dattente ou propos dun sujet pr-dtermin

    Utilisation de JMS (Java Messaging Service)

    Traitements asynchrones de messages JMS

    Lutilisateur demande un travail, mais nattend pas larponse Exemples

    Demande dimpression

    Demande de production de carte sim

  • 8/2/2019 06 Java EE Persistance

    12/12

    07/01/2011

    12

    Architecture MDB

    ClientClient

    Container EJB

    MDBQueue demessages

    Appel asynchrone