You are on page 1of 12

07/01/2011

JEE (J2EE) & Les applications web Persistance des donnes


ABDELTIF ELBYED AELBYED@GMAIL.COM

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 serveur JEE et au-del de la dure de lexploitation de lapplication Il faut sauvegarder ltat courant des donnes manipules par une application
Donnes transcientes dans les programmes (tableaux, chaines de caractres, etc.) Utilisation ncessaire de base de donnes pour sauvegarder les donnes Diffrents types de bases de donnes
SGBDR (relationnels) : Oracle, PostgreSQL, etc. SGBDO (objets) : Versant, O2, etc. XML : EDI (Echange de Donnes Informatises) Fichiers : Tableurs, fichiers texte, etc.

Problmatique
Lutilisation de bases de donnes objet nest pas encore un 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 est incontournable 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 et performance

Contraintes
Objet = donnes (attributs) + comportement (mthodes) Enregistrement = donnes Les relations entre objets sont de diffrentes natures
composition hritage

Limpdance mismatch
De nombreuses questions se posent :
Comment convertir le rsultat dune requte SQL en objets JAVA? Comment rpercuter les modifications de ltat dun objet JAVA mapp? Comment modliser les relations entre objets dans la base? Comment modliser lhritage des objets dans la base? Comment modliser les objets dont les donnes sont rparties dans plusieurs tables? Quelle stratgie de cache utiliser pour viter des appels rpts la base?

Un modle objet est plus informatif quun modle relationnel


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

07/01/2011

Les solutions de Persistance


Lapproche JDBC (API, Design Pattern DAO)
LAPI et les types de drivers JDBC Framework iBatis

Architecture de rfrence

Lapproche composant
Les EJB Entity

Prsentation

Modle

Persistance

Les solutions de mapping Objet/Relationnel


Open Source : Hibernate, OJB Commerciales : TopLink, CocoBase
JSF Struts Struts Shale Servlets/JSP Applications clientes EJB SPRING JavaBean DAO, JDBC EJB Hibernate Toplink Connecteurs

Lapproche standard JDO


Open Source : JORM, TJDO, XORM, RI (Rfrence Implmentation) Commerciales : JDO (Libelis, SolarMetric)

Lapproche full Object


Base de donnes objet

Data-Access Objects Pattern


Permet de rester indpendant du type de la source de donnes (SGBDR, Base Objets, Systme de fichiers) Joue le rle dadaptateur entre le client et la source de donnes La stratgie daccs aux donnes ne doit pas dterminer la modlisation des objets mtiers Possibilit de changer la stratgie daccs aux donnes sans rcrire le code mtier Approche lgre base sur le choix des bons Design Patterns Les avantages :

Le mapping Objet/Relationnel
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 dobjet dans la base Langage de requtage OQL

EJB: Enterprise Java Bean

Modle de composants mtiers, connu surtout dans le domaine de la persistance dobjets La gestion de la persistance peut tre prise en charge par
le bean lui mme (Bean Managed Persitence ou BMP) le conteneur d'EJB (Container Managed Persistence ou CMP)

Avantages :
Annule la problmatique de limpdance mismatch Trs bonnes performances pour les parcours de graphes dobjets Opportunits apportes par JDO

Inconvnients :
Connu pour sa lourdeur Difficile maintenir

Inconvnients :
March de niche Gestion des traitements Batch

Amlioration avec les EJB 3

07/01/2011

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 de gestion de la persistance en Java
Nombreuses implmentations existantes : JPox (implmentation de rfrence de JDO), Castor JDO, etc.

Plan
1. 2. 3. 4. Les services de persistance JDBC EJB Hibernate

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

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

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

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.)

Quatre composants majeurs


pilotes (ou drivers) connexions requte (Statement) ensemble rsultat (ResultSet)

Possibilit de se connecter plusieurs SGBDR en mme temps Bibliothques reposant sur SQL
Possibilit de slections, de jointures, de transactions, etc.

tapes pour la mise en uvre


1. 2. 3. 4. 5. 6. Chargement du pilote Connexion la base de donnes Cration de la requte Envoi de la requte Rception dun ensemble rsultat Extraction des donnes de lensemble rsultat

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

Chargement du pilote

Spcification du pilote charger


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

charge la classe dans la machine virtuelle enregistre le pilote dans le DriverManager

Ncessaire une seule fois par JVM


fait gnralement dans une mthode dinitialisation

Plusieurs pilotes peuvent tre chargs en mme temps

07/01/2011

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 (1/2)

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)

Type 1 : Pont JDBC-ODBC


traduit les appels lAPI JDBC en appels lAPI ODBC Open DataBase Connectivity permet la communication entre clients pour bases de donnes sous Windows et SGBD du march.

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

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 des SGBD

On utilise souvent des pilotes de type 3 ou 4 Les pilotes de types 3 et 4 sont quivalent en termes de performance

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 indispensable dutiliser 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

Connexion la base de donnes (1/2)

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 de donnes (2/2)

Identification de la base par une URL


jdbc:subprotocol:subname subprotocol : nom du pilote (mysql, db2, oracle, etc.) subname : nom de la base (SAMPLE, etc.)

La classe DriverManager est responsable de la gestion des pilotes JDBC Le gestionnaire de pilotes DriverManager cherche un pilote enregistr pouvant traiter lURL
utilisateur (optionnel) : identifiant de lutilisateur motDePasse (optionnel) : mot de passe utilisateur
String url = "jdbc:odbc:base"; Connection conn = DriverManager.getConnection(url, utilisateur, motDePasse);

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

Il demande une connexion au pilote trouv et la retourne au programme appelant Une connexion reprsente une session avec une base de donnes quil faudra fermer ds lors qu'elle nest plus utilise Conn.close();

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
import java.sql.* public void doGet(){ try{

Exemple de connexion

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

Support des transactions (1/3)

Toutes les connexions JDBC sont rgles en mode auto-commit


chaque requte est excute dans une transaction spare

//Chargement du pilote Class.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 connexion String 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"); } }

Pour crer une transaction comprenant plusieurs requtes, dsactiver le mode auto-commit
Connection.setAutoCommit(false)

07/01/2011

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

Support des transactions (2/3)

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

Support des transactions (3/3)

Exemple Valider une transaction


Connection.commit()
//Chargement du pilote conn = DriverManager.getConnection("jdbc:db2:SAMPLE"); // Dsactiver le mode Auto-Commit conn.setAutoCommit(false);

Annuler une transaction


Connection.rollback()

// Dbut dune nouvelle transaction ... // Excution de requtes SQL if (condition) { // Fin de transaction conn.commit(); } else { // Fin de la transaction conn.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

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

Envoi de la requte

Crer un objet Statement


permet dexcuter une requte SQL
Statement stmt = aConnection.createStatement();

Langage SQL Requtes de type SELECT


executeQuery(requteSQL) retourne un objet ResultSet

Requtes de type INSERT, UPDATE ou DELETE Par la suite, la ressource devra tre libre
stmt.close();

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

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 (1/3)

//Chargement du pilote et ouverture de la connexion Class.forName("com.ibm.db2.jdbc.app.DB2Driver"); String url = "jdbc:db2:sample"; Connection conn = DriverManager.getConnection(url, "admin", "azerty"); // Creation de la requete et execution Statement requete = conn.createStatement(); ResultSet resultat = requete.executeQuery("SELECT lastName FROM EMPLOYEE");

Linterface PreparedStamement hrite de Statement Excution dune requte SQL pr-compile via linstanciation dun objet PreparedStatement
quand lobjet est cr, la requte SQL est envoye pour tre compile le rsultat est stock pour pouvoir rpondre une ou plusieurs mthodes de type execute() amliore les performances : permet lexcution de la mme requte plusieurs fois passage de paramtres IN la requte

07/01/2011

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 (2/3)

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)

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<Type>(position, <Type>)
String sql="SELECT lastName from EMPLOYEE WHERE SALARY > ? AND BONUS < ?"; PreparedStatement prepStmt = aConnection.prepareStatement(sql);

Exemple
//Chargement du pilote et ouverture de la connexion Class.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 < 3000 PreparedStatement requete = conn.prepareStatement("SELECT lastName FROM EMPLOYEE WHERE SALARY > ? AND BONUS < ?"); requete.setFloat(1, 20000f); requete.setFloat(2, 3000f); // Excution de la requte ResultSet 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)

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)

Excution de procdures SQL enregistres via linstanciation dun objet CallableStatement, sousclasse de PreparedStatement
quand lobjet est cr, la requte dappel (call) est envoye pour tre compile le rsultat est stock pour pouvoir rpondre une ou plusieurs mthodes de type execute encore plus rapide que PreparedStatement passage de paramtres IN et OUT

Paramtres de la requte
reprsents par des ? dans la requte SQL IN
valeur dfinie par des mutateur : set<Type>(position, <Type>)

OUT
enregistrs via la mthode registerOutputParameter valeur rcuprable par des accesseurs : <Type> get<Type>
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)

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

Extraction des donnes (1/3)

Exemple Parcours de lobjet ResultSet


//Chargement du pilote et ouverture de la connexion Class.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 OUT CallableStatement 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 valeur requete.executeUpdate(); BigDecimal nouveauSalaire = requete.getBigDecimal(2);

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

07/01/2011

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

Extraction des donnes (2/3)

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

Extraction des donnes (3/3)

Mthodes de linterface ResultSet


Mthode next() previous() first() last() beforeFirst() afterLast() isFirst/ isBeforeFirs t isLast/ isAfterLast absolute(index) Close() Description Permet de passer la ligne suivante de ResultSet Permet de passer la ligne prcdente de ResultSet Permet de se positionner sur la premire ligne Permet de se positionner sur la dernire ligne Permet de se positionner avant la premire ligne Permet de se positionner aprs la dernire ligne Retourne si le positionnement est /avant la premire ligne

Le ResultSet permet de rcuprer les colonnes de la range courante


en utilisant le nom ou lindex de la colonne

Les mthodes sont de la forme


<Type> get<Type>(int) <Type> get<Type>(String) exemple : String getString("prenom")

Retourne si le positionnement est /aprs la dernire ligne Permet de se positionner lindex pass en paramtre Permet de fermer le ResultSet

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 dextraction de donnes


SQL CHAR VARCHAR Java String String String java.math.BigDecimal java.math.BigDecimal Boolean Byte Short Int long

Correspondance des types


SQL REAL FLOAT DOUBLE BINARY VARBINARY LONGVARBINARY DATE TIME TIMESTAMP Java float Double Double byte[] byte[] byte[] java.sql.Date java.sql.Time java.sql.Timestamp

//Chargement du pilote et ouverture de la connexion Class.forName("com.ibm.db2.jdbc.app.DB2Driver"); String url = "jdbc:db2:sample"; Connection conn = DriverManager.getConnection(url, "admin", "azerty"); // Creation de la requete et execution Statement 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 ressources resultat.close(); requete.close(); conn.close();

LONGVARCHAR NUMERIC DECIMAL BIT TINYINT SMALLINT INTEGER BIGINT

Gestion des exceptions


La plupart des mthodes cites peuvent dclencher une SQLException
doit tre capture lintrieur dun bloc try/catch volontairement non traite dans les exemples pour plus de clart

Exemple dextraction de donnes avec gestion des exceptions (1/2)


import java.sql.* public void doGet(){ Connection conn = null; try{ //Chargement du pilote Class.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 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(); ResultSet resultat = requete.executeQuery("SELECT * FROM EMPLOYEE");

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

07/01/2011

Exemple dextraction de donnes avec gestion des exceptions (2/2)


// Parcours de lensemble rsultat et affichage while (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"); } }

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 des ressources ne sera pas dclench

Pour faire en sorte que toutes les ressources soient libres quil y est exception ou non, il faut mettre le code de libration dans le bloc finally de la structure try/catch/finally

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

Exemple dextraction de donnes avec gestion des 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 est fonctionnel
Si une exception est lance par resultat.close() par exemple, le code correspondant la fermeture de la requte et la fermeture de la connexion 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 des exceptions corrig


try{ } catch (SQLException e) { } finally{ // Libration des ressources if(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 et lourde Possibilit dutiliser une classe statique qui servira fermer les connexions
Pas besoin dinstanciation, on utilise directement le nom de la classe Pas besoin de constructeur dans la classe statique

07/01/2011

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


import java.sql.Connexion; import java.sql.Statement; import java.sql.ResultSet; public class OutilsFermetureBD { // Fermeture dun ResultSet public static void fermerConnexion(ResultSet resultat) { if(resultat!=null) { try{ resultat.close(); } catch (SQLException e) { e.printStackTrace(); } } } // Fermeture dun Statement public static void fermerConnexion(Statement stat) { if(stat!=null) { try{ stat.close(); } catch (SQLException e) { e.printStackTrace(); } } }

Exemple dextraction de donnes avec gestion des exceptions amlior (2/2)


// Fermeture dune connexion public static void fermerConnexion(Connexion conn) { if(conn!=null) { try{ conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }

Code dutilisation de la classe


try{ } catch (SQLException e) {} finally{ // Libration des ressources OutilsFermetureBD.fermerConnexion(resultat); OutilsFermetureBD.fermerConnexion(requete); OutilsFermetureBD.fermerConnexion(conn); }

Performances avec JDBC


Laccs aux bases de donnes constitue souvent un goulet dtranglement 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 tre crites 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 les transactions longues)

Plan
1. 2. 3. 4. Les services de persistance JDBC EJB Hibernate

Lide
Dfinir une fois pour toutes la correspondance entre le monde objet et le monde relationnel puis laisser le framework gnrer lui mme les requtes SQL (INSERT, DELETE, SELECT, UPDATE) Cette correspondance se nomme mapping Objet/Relationnel

07/01/2011

La norme EJB
Prsentation

La norme EJB
Les EJBs sont des composants Java qui rsident dans le container EJB des serveur dapplication J2EE Les EJBs sont des composants

Mtier

Persistance

Distribus (accessibles distance, ex: RMI) Portables Persistants Transactionnels

Base de donnes

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

EJB : Entreprise JavaBean


Serveur 1 Serveur 2 Container
RMI

La notion de composant
Les composants sont des morceaux de programme dvelopps et dploys de faon indpendante et qui prsentent une interface permettant leur assemblage

Client
HTTP

Browser
HTML

Serveur HTTP

Servlets et JSP
RMI

EJB EJB EJB JVM Serveur 3 Container EJB EJB EJB JVM

J D B C

Serveur

analogie avec llectronique, notion de bote noire

Moteur de servlets JVM

J D B C

La spcification EJB dtaille comment implmenter ces composants

Objectifs des EJBs


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

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 des donnes persistantes lapplication cliente dpose une demande de traitement asynchrone. Ce traitement sera ralis par un rcepteur asynchrone.

Offrir une solution standard


indpendante des OS et des fournisseurs de serveur dapplications

Trois types dEJB pour rpondre ces besoins


Session Bean Entity Bean Message Driven Bean

Couvrir les phases de dveloppement, dploiement et exploitation

10

07/01/2011

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 pas transactionnel Deux types :
Sans tat (Stateless) Avec tat (Stateful)

Architecture base dEJB Session

Etat de la session Client Client Session Bean

SGBD

Autre systme Container EJB

Prsentation des EJB Entits


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

EJB Session et EJB Entits

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)

Client

Client

Entity Bean

SGBD

Container EJB

Concurrent des frameworks de persistance


exemple: Hibernate

Architecture base dEJB Entits

Prsentation des Message Driven Bean


Un Message Bean est un bean qui peut tre activ par un message 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)

Etat de la session Client Session Bean Entity Bean SGBD

Traitements asynchrones de messages JMS Lutilisateur demande un travail, mais nattend pas la rponse

Client

Container EJB

Exemples
Demande dimpression Demande de production de carte sim

11

07/01/2011

Architecture MDB

Appel asynchrone

Client

Client

Queue de messages

MDB

Container EJB

12

You might also like