633-2.2 Dialogue avec la base de données

publicité
633-2.2
Dialogue avec la base de données
3. Manipulation des données avec un langage hôte
[email protected]
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
1
Références
• Filière
– Bachelor of Science en informatique de gestion
• Domaine
– Technologies informatiques
• Module
– 633 – Architectures distribuées
• Unité d’enseignement
– 633-2.1 – Applications réseaux et services applicatifs
– 633-2.2 – Dialogue avec la base de données
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
2
Objectifs
• Objectifs du module
– comprendre et mettre en œuvre les services applicatifs
fondamentaux;
– développer, déployer et configurer des composants métiers
sur un serveur d’applications.
• Objectifs de l’unité d’enseignement « Dialogue avec
la base de données »
– comprendre les différences entre l'architecture "serveur de
fichiers" et "client/serveur";
– maîtriser le principe du dialogue à sessions;
– comprendre la notion de concurrence;
– savoir manipuler des données à l'aide d'un langage hôte.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
3
Découpage de l’unité d’enseignement
1. Architecture client/serveur
2. Transactions et verrous
3. Manipulation des données avec un langage hôte
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
4
Plan de la présentation
•
SQL interactif<> SQL programmé
•
Application Programming Interface pour bases de données
•
Connexion aux bases de données avec un langage hôte
•
Statements et curseurs
•
Transactions et sessions
•
Verrous
•
Pools de connexions
•
Améliorations et limites du JDBC
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
5
Quizz
• Quel est le lien « visible » entre l’utilisateur et votre
base de données?
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
6
Interface utilisateur
• Un utilisateur final n’utilise pas SQL pour manipuler
des données.
• L’informaticien de gestion doit lui proposer une
interface utilisateur adaptée à ses besoins.
– Pour se faire, il doit développer une interface utilisateur
(IHM) à l’aide d’un langage de programmation.
– Java, C#, PHP, Oracle Apex…
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
7
Exemple d’interface utilisateur
Proconcept ERP
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
8
Exemple d’interface utilisateur
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
Interface de FUTURA – Université de Fribourg
9
Positionnement de l’IHM dans une
architecture logicielle
Utilisateur
final
Transactions
IHM
Logique applicative
Logique métier
Services
Logique de présentation
Programmes
Logique de persistance
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
BD
10
Simplifions
• De quoi est constitué le code de l’application?
– ?
Utilisateur
final
Code de l’application
BD
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
11
Qu’allons-nous apprendre dans ce cours?
Utilisateur
final
Code de l’application
Code de l’application
• IHM
• Code métier
• Règles de navigation
• Accès à la base de données
• Requêtes SQL
BD
• L’accès à la BD et les requêtes SQL
que vous développez sont du « SQL
programmé ».
SQL programmé
Permet le dialogue avec la base de données!
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
12
SQL programmé
• SQL programmé
– Intégrer le LMD dans un programme que vous développez.
• Mélange d’instructions SQL, de boucles, de classes, etc…
– Les requêtes doivent pouvoir gérer des variables.
– Le langage permettant d’intégrer des instructions SQL se
nomme « langage hôte »
Utilisateur
final
Code de l’application
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
BD
Langage hôte
13
SQL interactif
• SQL interactif
– Utiliser le SQL LMD sans l’encapsuler dans un programme.
– Très intéressant pour les professionnels.
• Contrôle de la BD, interrogation du dico…
• Utilisé depuis SQL*Plus (pour Oracle), SQLDeveloper, Toad…
SQL interactif
BD
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
Développeur
14
SQL programmé <> SQL interactif
SQL Programmé
SQL interactif
Sans paramètre
• A vous de Avec paramètres
spécifier les différences…
– 5 minutesPeuvent être construite puis restitution en classe ‐
dynamiquement
Ca se compile pas
On voit les erreurs directement
Utilisé par les utilisateurs finaux
Utilisé par les développeurs
Accès au curseur
Pas accès au curseur
Prédéfinies et fixes (avec paramètre)
Liberté totale
Une méthode pour chaque requête
Requête  résultat
SQL + langage hote
On ne peut connaitre «que» SQL
CRUD
LMD LDD LCD
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
15
Questions ?
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
16
Plan de la présentation
•
SQL interactif<> SQL programmé
•
Application Programming Interface pour bases de données
•
Connexion aux bases de données avec un langage hôte
•
Statements et curseurs
•
Transactions et sessions
•
Verrous
•
Pools de connexions
•
Améliorations et limites du JDBC
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
17
Langage hôte et API
• Tous les langages « modernes » permettent
d’intégrer du SQL. Ils sont donc considérés comme
langage hôte.
– Java, C#, PHP…
• Les langages hôtes peuvent intégrer du SQL via
différentes méthodes.
• L’utilisation d’API est l’une des méthodes les plus
utilisée.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
18
Application Programming Interface
• Une API est un ensemble de classes et méthodes
permettant de faire appel à des services de
différents fournisseurs de façon unique.
– SAX API, DOM, Java RMI, etc…
• Il peut aussi s’agir de méthodes publiées par un
fournisseur pour interagir avec son système.
• Dans le cadre des BD, une API permet l’utilisation de
classes et méthodes pour simplifier et standardiser
l’appel à des sources de données.
– JDBC, ODBC, OLE DB
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
19
Application Programming Interface
API
JDBC, ODBC…
Source de données
Client base de données
SQLNet…
Protocol
TCP…
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
20
Des normes ? Des accords ?
• Le principe est toujours le même…
• Un groupe d’experts composés de fournisseurs et
d’indépendants se mettent d’accord sur la signature
des méthodes de leur API.
– Par exemple pour une API de BD: méthode connect() avec
en paramètre le nom de la BD, méthode lanceSelect() avec
en paramètre le select…
– Chaque fournisseur implémente ces méthodes (en
respectant la signature) et fournit une implémentation de
l’API.
• Principe de l’Interface en Java.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
21
Quelques API pour accéder aux données
• ODBC
– Open Database Connectivity est une API permettant l’accès et la
manipulation de données d’un très grand nombre de fournisseurs de bases
de données.
• OLE DB
– OLE DB est une API permettant l’accès à différentes sources de données.
OLE DB n'est pas réservée aux sources de données relationnelles, mais est
capable de traiter n'importe quel type de données indépendamment de leur
format ou de leur méthode de stockage.
– OLEDB et ODBC sont très utilisés dans le monde Microsoft pour accéder à
des données (depuis VB, Excel…)
• JDBC
– API standard permettant l’utilisation de bases de données depuis Java.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
22
Avantages et inconvénients des APIs
• Niveau d’abstraction
– Apporte une couche supplémentaire générique.
• Permet l’accès à des services de différents
fournisseurs de façon unique.
• Librairie supplémentaire à maîtriser pour le
développeur.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
23
Questions ?
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
24
Eléments clés des étudiants
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
25
Travaux pratiques
• Série 3, exercices 1 et 2
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
26
Plan de la présentation
•
SQL interactif<> SQL programmé
•
Application Programming Interface pour bases de données
•
Connexion aux bases de données avec un langage hôte
•
Statements et curseurs
•
Transactions et sessions
•
Verrous
•
Pools de connexions
•
Améliorations et limites du JDBC
– JDBC
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
27
JCP et JSR
• Java Community Process (JCP)?
“The JCP is the mechanism for developing standard
technical specifications for Java technology. Anyone
can register for the site and participate in reviewing
and providing feedback for the Java Specification
Requests (JSRs), and anyone can sign up to become
a JCP Member and then participate on the Expert
Group of a JSR or even submit their own JSR
Proposals”
Source: http://jcp.org/en/home/index
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
28
JCP et JSR
• Java Specification Requests (JSR)?
“A JSR is a Java Specification Request. This is the
document submitted to the PMO1 by one or more
members to propose the development of a new
specification or significant revision to an existing
specification. There are currently more than 90 Java
technology specifications in development in the JCP
program. “
Source: http://jcp.org/en/introduction/faq
1. The Program Management Office is the group within Sun designated to oversee
the Java Community Process and manage the daily running of the program.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
29
A quoi ça ressemble?
• JDBC évolue sur des JSR…
• Et aussi à l’aide du monde open source…
• Voyons à quoi ça ressemble…
– http://jcp.org/en/home/index
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
30
JDBC introduction
• JDBC = Java DataBase Connectivity
–
–
–
–
JDBC
JDBC
JDBC
JDBC
1.0
2.0
3.0
4.0
(Java 1)
(J2SE 1.2)
(J2SE 1.4)
(Java SE 6)
• API standard permettant l’utilisation de bases de
données relationnelles depuis le monde Java.
• Il s’agit d’un ensemble de classes pouvant être utilisé
depuis une application Java et permettant:
– la gestion de la connexion à la base de données;
– l’utilisation de commandes SQL (DDL, DML, DCL);
– l’exploitation des résultats de requêtes (données).
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
31
JDBC rend indépendant…
• JDBC permet aux développeurs d’utiliser des classes
et méthodes indépendantes du SGBDR.
– JDBC utilise les drivers fournis par chaque constructeurs de
bases de données.
– A vous, en tant que développeur, d’utiliser les bons drivers
et de les tester !
Application java
jdbc
driver Oracle
Oracle
driver MySQL
MySQL
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
32
Types de drivers
• Les drivers JDBC peuvent être de 4 types:
–
–
–
–
pilotes
pilotes
pilotes
pilotes
de
de
de
de
types
types
types
types
1;
2;
3;
4.
• 2 cas de figure :
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
33
Pilotes de type 1
• Pilotes non autonomes… Ils accèdent aux bases de
données par une passerelle (via une autre technologie).
• « JDBC-ODBC » est le plus connu. Ce type de pilote
convertit les ordres Java JDBC en ODBC valide. C’est
ODBC qui ensuite exécute les ordres.
– Ce pilote est livré en standard par Oracle (Sun) avec JDBC.
– Permet une connexion vers des bases de données ne disposant
pas d’un driver JDBC.
– Peu performant
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
34
Pilotes de type 2
• Il s’agit de pilotes natifs.
– Aussi nommé drivers « OCI » chez Oracle.
– classes12.jar (J2SE 1.2), ojdbc14.jar (J2SE 1.5, Java SE 5) et ojdbc6.jar (Java SE
6) contiennent tous un driver de type 2 pour se connecter à Oracle.
– Nécessite l’installation du client Oracle sur la machine qui lance des
commandes JDBC.
– Très bonnes performances
• Les commandes Java JDBC sont traduites en appels
natifs vers le serveur de base de données.
GES-DP130227-633-2.2_Dialogue_BD_3
PDA-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
35
Pilotes de type 3
• Il s’agit de pilotes entièrement écrit en java
convertissant les appels JDBC en un protocole
indépendant du SGBD.
• Ce type de pilote fait appel à
intermédiaire pour accéder le SGBD.
un
serveur
• A ce jour, je n’en ai encore jamais rencontré.
GES-DP130227-633-2.2_Dialogue_BD_3
PDA-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
36
Pilotes de type 4
• Pilotes écrits en java se connectant au SGBD.
– Aussi nommé drivers « thin » chez Oracle.
– classes12.jar (J2SE 1.2), ojdbc14.jar (J2SE 1.5, Java SE 5) et
ojdbc6.jar (Java SE 6) contiennent tous un driver de type 4
pour se connecter à Oracle.
– Facile à installer.
– Indépendant à la plateforme.
– Performance identique aux drivers de type 2.
– Ne nécessite pas d’installation d’autres médiateurs.
GES-DP130227-633-2.2_Dialogue_BD_3
PDA-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
37
Jar et implémentation JDBC d’Oracle
• Un JAR (Java ARchive) est un ensemble de classes,
interfaces, fichiers Java compilés et compressés dans
un fichier  le .jar
• Chaque fournisseur de BD livre une librairie .jar
contenant son implémentation JDBC pour sa base de
données.
– Oracle fournit les jar classes12.jar, ojdbc14.jar, ojdbc6.jar…
– PostgreSQL fournit les jar postgresql-9.0dev-800.jdbc4.jar…
– IBM fournit db2jcc.jar pour DB2
• Chaque fournisseur livre son implémentation de JDBC.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
38
Compatibilité des drivers Oracle
Version de Java
Driver
Java 1.2 et 1.3
classes12.jar
Java 1.4
ojdbc14.jar
Java 5
ojdbc5.jar
Java 6
ojdbc6.jar
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
39
JDBC packages
• JDBC 4.0 est réparti dans 2 packages
– java.sql
• Package permettant l’accès et la manipulation de données provenant d’une base de données relationnelle via le langage hôte Java.
– javax.sql
• Package pour la partie serveur (utilisation de datasource d’un serveur d’applications par exemple).
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
40
java.sql
• java.sql contient des interfaces (au sens java).
• C’est au fournisseur d’implémenter ces interfaces.
– L’implémentation doit être faite par les constructeurs de
SGBDR.
• Certaines interfaces peuvent ne pas être implémentées mais seront disponibles tout de même…
– En simplifiant, chez Oracle c’est le jar ojdbc6.jar qui
implémente les interfaces définies chez Sun.
– C’est donc à Oracle de développer et livrer un driver JDBC.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
41
Les interfaces et classes importantes de l’API
JDBC
• DriverManager
– Classe de base pour gérer les drivers JDBC et pour créer
une connexion.
• Connection
– C’est une session à la base de données.
– Cet objet (une fois instancié…) va permettre de gérer les
transactions, de créer des « statements »…
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
42
Les interfaces et classes importantes de l’API
JDBC
• Statement
– Interface à utiliser pour exécuter des instructions SQL
statiques. Retourne le résultat produit dans un ResultSet.
• PreparedStatement
– Objet à utiliser pour exécuter des requêtes paramètrées.
•
CallableStatement
– Objet à utiliser pour exéctuer des procédures stockées.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
43
Les interfaces et classes importantes de l’API
JDBC
• ResultSet
– Un “set” de données resultant de la base de données.
– Notion de curseur… (rappel PL/SQL…)
• ResultSetMetaData
– Cet classe peut être instanciée pour obtenir les métadonnées d’un ResultSet.
• …
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
44
Relation entre les interfaces JDBC
• DriverManager
• Connection
• Statement
• ResultSet
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
45
JDBC avantages
• Portabilité.
• Implémenté par tous les fournisseurs de BD.
• Relativement facile d’utilisation.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
46
JDBC désavantages
1/2
• API de bas niveau.
• Pas de contrôle de SQL lors du développement.
– Erreur à l’exécution…
• Attention, certaines méthodes peuvent ne pas être
implémentées par des fournisseurs…
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
47
JDBC désavantages
2/2
• Du code propriétaire à une base de données n’est
pas portable!
– « select connect by » sur Oracle
– « select * from employe, departement where
employe.dep_id = departement.id »  jointure non
standard
• Problème paradigme Objet  Relationnel.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
48
Les bonnes façons de faire…
• Il ne faut pas oublier les bonnes pratiques liées aux
bases de données:
– gérer correctement les transactions ;
– ne pas oublier les verrous;
– …
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
49
Questions ?
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
50
Eléments clés des étudiants
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
51
Plan de la présentation
•
SQL interactif<> SQL programmé
•
Application Programming Interface pour bases de données
•
Connexion aux bases de données avec un langage hôte
•
Statements et curseurs
•
Transactions et sessions
•
Verrous
•
Pools de connexions
•
Améliorations et limites du JDBC
– JDBC
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
52
Schéma de principe de connexion
Programme
(langage hôte)
Requêtes SQL
Curseurs
…
Base de données
Connexion
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
53
Langage hôte utilisé dans ce cours
• Nous allons utiliser Java comme langage hôte pour
illustrer les concepts de ce cours.
• JDBC sera l’API à utiliser…
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
54
Connexion à une base de données à l’aide de
JDBC
• DriverManager
– Classe de base pour gérer les drivers JDBC et pour créer
une connexion.
– La méthode getConnection permet de retourner une
instance de « Connection ».
Connection myConn =
DriverManager.getConnection(url, user, password);
• Connection
– Connection est une interface
– Cet objet (une fois instancié…) va permettre de gérer les
transactions, de créer des « statements »…
• C’est une session à la base de données.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
55
Schéma de principe de connexion
en Java
Programme
Java
Requêtes SQL
Curseurs
…
Base de données
Connection
try{
Connection myConn =
DriverManager.getConnection(url, user, password);
catch(SQLException sqle)
{
System.out.println("Erreur SQL:" + sqle);
}
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
56
Utilisation du bloc try… catch
• Veuillez pour l’instant encapsuler vos instructions
JDBC (connexion, appel de requêtes SQL, etc.) dans
un bloc try – catch.
– Nous traiterons plus en détail dans un prochain chapitre la
gestion des exceptions en Java (lié aux BD)
try{
Connection myConn =
DriverManager.getConnection(url, user, password);
catch(SQLException sqle)
{
System.out.println("Erreur SQL:" + sqle);
}
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
57
Quelques méthodes de l’interface Connection
• createStatement
– Creates a Statement object for sending SQL statements to
the database prepareStatement(String)
• preparedStatement
– Creates a PreparedStatement object for
parameterized SQL statements to the database
sending
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
58
Quelques méthodes de l’interface Connection
• getMetaData
– Retrieves a DatabaseMetaData object that contains
metadata about the database to which this Connection
object represents a connection
• close()
– Releases this Connection object's database and JDBC
resources immediately instead of waiting for them to be
automatically released
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
59
Quelques méthodes de l’interface Connection
• setAutoCommit(boolean)
– Sets this connection's auto-commit mode to the given state
• commit()
– Makes all changes made since the previous commit/rollback
permanent and releases any database locks currently held by
this Connection object
• rollback()
– Undoes all changes made in the current transaction and
releases any database locks currently held by this Connection
object
* Explications tirées de la document Java
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
60
Schéma de principe de connexion
en Java
Statement
Programme
Java
PreparedSt
atement
Base de données
Connection
…myConn.createStatement()…
…myConn.preparedStatement()…
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
61
Avant JDBC 4.0
• JDBC 4.0 existe depuis Java SE 6.0.
• Avant cette version, il était nécessaire de charger le
pilote JDBC avant d’effectuer une connexion à la
base de données.
– Class.forName() pour les pilotes de type 1.
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
– DriverManager.registerDriver() pour les pilotes de type 2, 3
et 4.
DriverManager.registerDriver(
new Oracle.jdbc.driver.OracleDriver());
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
62
Fermeture des connexions JDBC
• Une connexion à la base de données via JDBC est
fermée automatiquement via le garbage collector.
• Toutefois, afin de libérer les ressources dès que
possible, il est nécessaire de fermer correctement les
connexions.
Connection myConn;
…
myConn.close();
…
• Afin de s’assurer de la fermeture correcte des
connexions, une bonne pratique consiste à fermer les
connexions dans la partie finally des exceptions.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
63
Utilisation de librairie
• Pour que votre programme Java puisse fonctionner, il
est nécessaire qu’il puisse référencer votre librairie
JDBC.
– ojdbc6.jar par exemple avec Java SE 6.
• N’oubliez donc pas de configurer votre EDI…
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
64
Questions ?
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
65
Eléments clés des étudiants
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
66
Travaux pratiques
• Série 3, exercice 3
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
67
Plan de la présentation
•
SQL interactif<> SQL programmé
•
Application Programming Interface pour bases de données
•
Connexion aux bases de données avec un langage hôte
•
Statements et curseurs
•
Transactions et sessions
•
Verrous
•
Pools de connexions
•
Améliorations et limites du JDBC
– Statements, PreparedStatement et CallableStatement
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
68
Schéma de principe de connexion
en Java – Rappel!
Statement
Programme
Java
PreparedSt
atement
Base de données
Connection
…myConn.createStatement()…
…myConn.preparedStatement()…
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
69
Connexion et objets associés
• Lorsqu’une connexion est établie entre votre
programme Java et votre base de données, vous
pouvez utiliser des objets permettant l’exécution
d’instructions SQL:
– Statement
– PreparedStatement
– CallableStatement
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
70
Statement
« The object used for executing a static SQL statement
and returning the results it produces»
• L’interface
Statement
fournit
les
méthodes
nécessaires à la soumission d’une instruction SQL
statique.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
71
Statement
Création
• La création d’un objet de type Statement s’effectue à
l’aide de votre objet de type Connection par la
méthode createStatement().
Connection myConn =
DriverManager.getConnection(url, user, password);
Statement stmt = myConn.createStatement();
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
72
Statement
Manipulation
• Une fois un objet de type Statement instancié, vous
pouvez le manipuler. Voici les méthodes principales:
Method summary
ResultSet
executeQuery(String sql)
Executes the given SQL statement, which returns a single ResultSet object
int
executeUpdate(String sql)
Executes the given SQL statement, which may be an INSERT, UPDATE, or DELETE statement or an SQL statement that returns nothing, such as an SQL DDL statement
void
close()
Releases this Statement object's database and JDBC resources immediately instead of waiting for this to happen when it is automatically closed
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
Source: http://download.oracle.com/javase/6/docs/api/
73
Statement
Manipulation
• executeUpdate ou executeQuery?
Instruction SQL
Méthode à utiliser
LDD
executeUpdate
SELECT
executeQuery
LMD (autre que SELECT)
executeUpdate
LCD
executeUpdate
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
74
Statement
Manipulation - exemple
…
Statement stmt = myConn.createStatement();
ResultSet curseurJava = stmt.executeQuery("SELECT
id, nom, prenom FROM EMPLOYES ");
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
75
Statement
Mais encore?
• En 2 fois!
• La soumission d’une instruction SQL s’effectue en 2
phases:
– Contrôle des tables et colonnes nécessaires (Metadata)
– Exécution de l’instruction
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
76
PreparedStatement
« An object that represents a precompiled SQL
statement »
• L’interface PreparedStatement hérite de Statement et
la spécialise en fournissant les méthodes nécessaires
à la soumission d’une instruction SQL dynamique.
• Un PreparedStatement permet l’exécution d’une
instruction SQL paramétrée.
– Permet de passer des paramètres liés à un ordre SQL (bind
parameters).
– Les paramètres sont passés par position.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
77
PreparedStatement
Création
• La création d’un objet de type PreparedStatement
s’effectue à l’aide de votre objet de type Connection
par la méthode prepareStatement(String).
Connection myConn =
DriverManager.getConnection(url, user, password);
PreparedStatement stmt =
myConn.prepareStatement("Ordre SQL");
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
78
PreparedStatement
Manipulation
• Une fois un objet de type PreparedStatement
instancié, vous pouvez le manipuler :
Method summary
ResultSet
executeQuery(String sql)
Executes the given SQL statement, which returns a single ResultSet object
int
executeUpdate(String sql)
Executes the given SQL statement, which may be an INSERT, UPDATE, or DELETE statement or an SQL statement that returns nothing, such as an SQL DDL statement
void
close()
Releases this Statement object's database and JDBC resources immediately instead of waiting for this to happen when it is automatically closed
void
setXXX(int,XXX)
Sets the designated parameter to the given Java XXX type value
setString(int, String), setDate(int, Date), setDouble(int, double)…
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch Source: http://download.oracle.com/javase/6/docs/api/
79
PreparedStatement
Manipulation - exemple
…
PreparedStatement stmt =
myConn.prepareStatement("update employe
set salaire = ?");
stmt.setBigDecimal(1, new BigDecimal(5500));
stmt.executeUpdate();
…
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
80
PreparedStatement Vs Statement
• Il est possible de passer des paramètres à des simples
Statement sans utiliser de PrepardStatement.
– En concaténant les paramètres aux ordres SQL dans des
chaînes de caractères.
stmt = MyConn.createStatement();
query = "UPDATE PROJ_TACHE_MAINTENANCE " +
"set description = '" + parametre1 +
"',proj_projet_id = " + parametre2 +
", proj_etat_id = " + parametre3 +
" where id = " + parametre4;
• Cette façon de procéder est mauvaise!
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
81
Avantages des PreparedStatement par rapport
aux Statement
• Performance
– Il n’est compilé qu’une seule fois même si les paramètres
changent  gain si la commande SQL est lancée n fois.
• Facilité d’utilisation
– L’utilisation de variables liées (ou paramètres liés) est plus
adéquat.
• Portabilité
– Par exemple , les setDate() permettent de masquer les
différents types de format de dates des BD.
• Sécurité
– Eviter l’injection de code SQL.
• Gestion des caractères spéciaux dans les setString()
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
82
CallableStatement
« The interface used to execute SQL stored procedures »
• L’interface
CallableStatement
PreparedStatement.
hérite
de
• Elle fournit les méthodes nécessaires à la soumission
d’un sous-programme (fonction, procédure stockée) de
votre base de données.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
83
CallableStatement
Création
• La création d’un objet de type CallableStatement
s’effectue à l’aide de votre objet de type Connection
par la méthode prepareCall().
Connection myConn =
DriverManager.getConnection(url, user, password);
CallableStatement proc = myConn.prepareCall
("{call paieSalaire(?)}");
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
84
CallableStatement
Appels
• Fonction
{?= call <procedure‐name>[(<arg1>,<arg2>, ...)]}
• Procédure
{call <procedure‐name>[(<arg1>,<arg2>, ...)]} GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
85
CallableStatement
Manipulation
• Une fois un objet de type CallableStatement
instancié, vous pouvez le manipuler. Les méthodes
importantes sont semblables aux méthodes de
l’interface PreparedStatement.
…
CallableStatement proc = myConn.prepareCall
("{call paieSalaire(?)}");
proc.setLong(1,7622702);
proc.execute();
…
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
86
Libération des objets
• Il est important de libérer les objets de type
Statement, PreparedStatement et CallableStatement
lorsque vous les avez utilisé.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
87
Questions ?
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
88
Eléments clés des étudiants
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
89
Travaux pratiques
• Série 3, exercice 4
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
90
Plan de la présentation
•
SQL interactif<> SQL programmé
•
Application Programming Interface pour bases de données
•
Connexion aux bases de données avec un langage hôte
•
Statements et curseurs
•
Transactions et sessions
•
Verrous
•
Pools de connexions
•
Améliorations et limites du JDBC
– Curseurs statiques
– Autres types de curseurs
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
91
Interfaçage relationnel / procédural
• Une requête sur une base de données retourne
généralement plusieurs lignes.
• Le résultat d’une requête depuis un langage
procédural doit s’effectuer dans une structure
adaptée aux traitements de plusieurs lignes.
 notion de curseur
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
92
Notion de curseur
«
Un curseur est une structure pouvant stocker le
résultat de requêtes et pouvant le manipuler ce
résultat via un langage hôte. »
• Un curseur est comme un pointeur parcourant un
tableau d'enregistrements, avec lequel on navigue via
le langage hôte en extrayant les lignes une à une.
• C’est une structure adaptée à la manipulation de
données en mémoire provenant d’une base de
données.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
93
Types de curseurs (ANSI)
• ANSI1 spécifie 4 types de curseurs
–
–
–
–
1.
Curseurs
Curseurs
Curseurs
Curseurs
statiques (lecture seule)
en avant seulement
dynamiques (lecture / écriture)
d’ensemble de valeurs clés (pointeurs)
American National Standards Institute. http://www.ansi.org/
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
94
Les curseurs en Java
• Comme tous les langages hôtes, Java propose une
structure adaptée aux traitements de plusieurs
lignes.
– java.sql.ResultSet
Pointeur
id
nom
prenom
12
bbb
ccc
4
asdf
cccc
23
bbb
adsf
Base de données
Instance de ResultSet
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
95
java.sql.ResultSet
“A table of data representing a database result set,
which is usually generated by executing a statement
that queries the database”
Source : http://download.oracle.com/javase/6/docs/api/
• Un ResultSet est une interface Java.
• Un objet de type ResultSet est instancié et alimenté
par le résultat de l’exécution d’un Statement ou
PreparedStatement.
…
Statement stmt = myConn.createStatement();
ResultSet curseurJava = stmt.executeQuery("SELECT
id, nom, prenom FROM EMPLOYES ");
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
96
ResultSet statique en avant seulement
• Un objet de type ResultSet est par défaut non
navigable et non modifiable.
– Il s’agit donc d’un curseur « statique en avant seulement ».
• Ce type de curseur est bien adapté au parcours d’un
ensemble de lignes résultant d’une requête SQL
(SELECT) pour affichage.
Sens de la lecture
id
nom
prenom
12
bbb
ccc
4
asdf
cccc
23
bbb
adsf
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
97
Parcours d’un ResultSet statique en avant
seulement
• Le parcours d’un ResultSet « statique en avant
seulement » s’effectue à l’aide d’une boucle.
• La méthode next() charge le prochain
enregistrement en retournant true tant qu’il y a des
éléments dans le curseur.
ème
Avant la boucle Après la boucle ème
er2
31(instanciation du next()
next()
(plus d’éléments)
next()
curseur)
…
while(curseurJava.next())
{
…
}
id
nom
prenom
12
bbb
ccc
4
asdf
cccc
23
bbb
adsf
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
98
Récupération de données
• Les méthodes getXxx(int) et getXxx(String), où Xxx
est le type de la colonne, permettent de récupérer la
valeur d’une colonne de l’enregistrement courant.
– getXxx(int) avec en paramètre le numéro de la colonne.
– getXxx(String) avec en paramètre le nom de la colonne.
…
while(curseurJava.next())
{
System.out.println(curseurJava.getString("nom")
+ " " + curseurJava.getString("prenom"));
}
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
id
nom
prenom
12
bbb
ccc
4
asdf
cccc
23
bbb
adsf
1er tour de la boucle, getString("nom");
99
Fermeture d’un ResultSet (curseur)
• Un curseur se ferme implicitement lorsque le
Statement ou PreparedStatement est fermé.
• Attention, une bonne pratique consiste à fermer le
curseur explicitement!
…
curseurJava.close();
…
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
100
Résumé des classes et interfaces de base JDBC
REESE, George. Database Programming with JDBC and Java. USA: O'Reilly, 2000.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
101
Questions ?
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
102
Eléments clés des étudiants
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
103
Travaux pratiques
• Série 3, exercice 5
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
104
Plan de la présentation
•
SQL interactif<> SQL programmé
•
Application Programming Interface pour bases de données
•
Connexion aux bases de données avec un langage hôte
•
Statements et curseurs
•
Transactions et sessions
•
Verrous
•
Pools de connexions
•
Améliorations et limites du JDBC
– Curseurs statiques
– Autres types de curseurs, navigables et dynamiques
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
105
Autres types de curseurs en Java
• Les curseurs « statiques en avant seulement »,
ResultSet, sont disponibles depuis JDBC 1.0.
• Afin de suivre la norme SQL-02 (SQL92) qui propose
des curseurs navigables, Java se dote d’une nouvelle
version de son API JDBC.
– JDBC 2.0
• JDBC 2.0 propose aussi de rendre les curseurs
modifiable (dynamiques).
– Lecture / écriture.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
106
ResultSet navigable
• Un curseur « statique en avant seulement » peut
être parcouru seulement du début jusqu’à la fin.
• Un curseur navigable peut être parcouru dans tous
les sens.
id
nom
prenom
12
bbb
ccc
4
asdf
cccc
23
bbb
adsf
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
107
ResultSet navigable
• Un objet de type ResultSet navigable est instancié et
alimenté par le résultat de l’exécution d’un
Statement ou PreparedStatement.
– Une constante de navigation doit être spécifiée lors de la
création du Statement ou PreparedStatement.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
108
ResultSet navigable
• Il existe 3 constantes de navigation:
– ResultSet.TYPE_FORWARD_ONLY
• Curseur non navigable (par défaut)
– ResultSet.TYPE_SCROLL_INSENSITIVE
• Curseur navigable et non sensible aux modifications dans les autres
transactions.
– ResultSet.TYPE_SCROLL_SENSITIVE
• Curseur navigable et sensible aux modifications des les autres
transactions.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
109
Sensibilité aux autres transactions
• Une curseur ResultSet.TYPE_SCROLL_INSENSITIVE
n’est pas mis à jour automatiquement lorsque les
données sont modifiées par une autre transaction.
• Une curseur ResultSet.TYPE_SCROLL_SENSITIVE est
mis à jour automatiquement lorsque les données
sont modifiées et validées (commit) par une autre
transaction.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
110
Création d’un curseur navigable
• La constante de navigation doit être spécifiée lors de
la création du Statement ou PreparedStatement.
• Exemple:
PreparedStatement stmt = myConn.prepareStatement("SELECT a, b, c"
+ "FROM d WHERE a = ? "
+ "ORDER BY b, c, a",
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
111
Parcours d’un ResultSet navigable
• Le parcours d’un ResultSet navigable peut s’effectuer
dans une boucle mais aussi à l’aide de méthodes
spécifiques dont:
–
–
–
–
–
last()
first()
isLast()
absolute(int position)
…
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
112
ResultSet modifiable
• Un ResultSet modifiable permet de mettre à jour les
données d’un ResultSet (en mémoire) et de répliquer
ces changements au niveau de la base de données.
– Il est donc possible d’effecuter des insertions, des
modifications et des suppressions de données.
• Afin de rendre un ResultSet modifiable, il est
nécessaire de spécifier la constante de modification:
– ResultSet.CONCUR_UPDATABLE
PreparedStatement stmt = myConn.prepareStatement("SELECT a, b, c"
+ "FROM d WHERE a = ? "
+ "ORDER BY b, c, a",
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
113
Suppression
• La méthode deleteRow() permet de supprimer la
ligne courante d’un curseur (pas dans la BD !).
– Le commit sur la connexion permettra de terminer la
transaction et donc appliquer les changements aux niveaux
de notre base de données.
…
/* se positionner sur la 4ème ligne qui est celle que l’on désire
supprimer…*/
curseurJava.absolute(4);
curseurJava.deleteRow();
myConn.commit();
– Attention, il est toujours possible d’exécuter une instruction
DELETE à l’aide de executeUpdate(). Cette fonctionnalité
deleteRow() doit être utilisée à bon escient.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
114
Modification
• Afin d’effectuer des mises à jour dans un curseur
modifiable, il est nécessaire de suivre quelques
points:
1.
2.
3.
4.
se positionner sur la ligne à mettre à jour;
mise à jour des valeurs;
propagation dans la base de données;
validation ou annulation de la transaction.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
115
Modification
• Exemple
…
/* 1. se positionner sur la ligne que l’on désire modifier…*/
curseurJava.absolute(4);
/* 2. mise à jour des valeurs */
curseurJava.updateString("a", "Toto");
/* 3. propagation dans la base de données */
curseurJava.updateRow();
/* 4. validation de la transaction */
myConn.commit();
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
116
Insertion
• Afin d’insérer des données dans un curseur
modifiable, il est nécessaire de suivre quelques
points:
1.
2.
3.
4.
se positionner afin de pouvoir insérer des données ;
mise à jour des valeurs ;
propagation dans la base de données ;
validation ou annulation de la transaction.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
117
Insertion
• Exemple
…
/* 1. se positionner afin de pouvoir insérer des données */
curseurJava.moveToInsertRow();
/* 2. mise à jour des valeurs
curseurJava.updateString("a",
curseurJava.updateString("b",
curseurJava.updateString("c",
*/
546);
"Test");
"Zoé");
/* 3. propagation dans la base de données */
curseurJava.insertRow();
/* 4. validation de la transaction */
myConn.commit();
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
118
Verrous?
• Nous verrons la problématique « multiutilisateurs »
dans un prochain chapitre.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
119
Limitations
• Impossible de rendre un ResultSet updatable dans
plusieurs cas:
– Jointures
– Requêtes de groupe
– Colonne mise à jour non présente dans la liste des colonnes
(au niveau SELECT )
– …
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
120
Questions ?
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
121
Eléments clés des étudiants
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
122
Travaux pratiques
• Série 3, exercices 6 et 7
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
123
Plan de la présentation
•
SQL interactif<> SQL programmé
•
Application Programming Interface pour bases de données
•
Connexion aux bases de données avec un langage hôte
•
Statements et curseurs
•
Transactions et sessions
•
Verrous
•
Pools de connexions
•
Améliorations et limites du JDBC
– Curseurs statiques
– Autres types de curseurs, RowSet
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
124
RowSet
• RowSet est une interface héritant de ResultSet.
• Cette structure est disponible dans le package
javax.sql.
• Un RowSet permet de manipuler des données
provenant d’une base de données ou d’une autre
source de données tabulaire.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
125
Avantage d’un RowSet
• Il existe 2 avantages à l’utilisation d’un RowSet par
rapport à un ResultSet :
– Un RowSet est un Javabean.
– Un RowSet permet de manipuler des données en mode
« connecté » et en mode « déconnecté »…
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
126
RowSet  Un JavaBean ?
• JavaBean?
“The JavaBeans™ architecture is based on a component model
which enables developers to create software units called
components. Components are self-contained, reusable software
units that can be visually assembled into composite
components, applets, applications, and servlets using visual
application builder tools. JavaBean components are known as
beans.”
http://download.oracle.com/javase/tutorial/javabeans/whatis/index.html
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
127
JavaBean
• Un JavaBean est une classe Java qui doit :
– posséder un constructeur par défaut ;
– encapsuler l’ensemble ses propriétés privées à l’aide
accesseurs respectant la convention get ou set suivi du nom
de la propriété avec la première lettre en majuscule ;
– être Serializable ;
– peut contenir des listeners spécifiques.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
128
Exemple de JavaBean
Source : http://fr.academic.ru/dic.nsf/frwiki/850799
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
129
RowSet connecté et déconnecté
• Différentes implémentations des RowSet sont
disponibles pour répondre aux multiples besoins des
applications de gestion :
– RowSet connectés ;
– RowSet déconnectés.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
130
RowSet connecté et déconnecté
• Un RowSet connecté utilise une connexion JDBC tout
au long de son cycle de vie…
– Un JdbcRowSet est un RowSet connecté. C'est une
enveloppe légère (wrapper) autour d'un ResultSet
permettant d’utiliser un RowSet comme un bean java.
• Un RowSet déconnecté ?!? Pour quoi faire?
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
131
RowSet déconnecté
• Comment fonctionne
déconnecté?
généralement
un
RowSet
1. demande une connexion pour aller “récupérer” les données ;
2. se déconnecte (généralement);
•
 plus besoin de réseau, de driver JDBC…
3. le client l’utilise localement (suppression, mise à jour,
insertion de données). Le RowSet maintient des méta
données sur les données qu’il contient et sur l’état du
RowSet.
4. le client se reconnecte et va mettre à jour les données de la
base de données.
•  en pensant aux conflits… (vous n’êtes pas seul sur votre BD !)
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
132
Les différents types de RowSet déconnectés
• RowSet est l’interface mère.
• Un CachedRowSet est un RowSet déconnecté et
stocke ses données en mémoire.
– adapté aux petites quantités de données ;
– adapté aux clients légers tels que les PDA.
• Un WebRowSet est un RowSet déconnecté.
– adapté aux applications web;
– adapté à la lecture de fichiers XML ou de flux de données.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
133
Les différents types de RowSet déconnectés
• Un FilteredRowSet est un RowSet déconnecté.
– permet de filtrer les données présentées à l'utilisateur grâce
à l’interface Predicate.
• Un JoinRowSet est un RowSet déconnecté.
– permet d’effectuer des jointures avec des objets
implémentant Joinable.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
134
Comparaison avec les ResultSet
• RowSet extends the ResultSet interface, so you can
use the same as using the ResultSet RowSet.
• RowSet extends the ResultSet interface and
functionality than the ResultSet so more richer.
• By default, all RowSet objects are scrollable and
updatable. The ResultSet is rolling forward only and
read-only.
• RowSet can be non-links, and ResultSet is connected.
Therefore, interfaces can be offline use CacheRowSet
data.
Source : http://www.softcov.com/programming-and-testing/teach-you-to-use-java-in-the-rowset.html
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
135
Comparaison avec les ResultSet
• RowSet interfaces added to the JavaBeans component
model of the JDBC API support. Rowset can be used
as visual development environment for JavaBeans
Bean components.
• CacheRowSet can be serialized.
• RowSet and ResultSet represents the data rows,
attributes, and related methods of operation.
• He thinks, should tend to RowSet as something
unrelated to the database, it is only a representative
of rows of data objects, and ResultSet is a close link
with the database stuff.
Source : http://www.softcov.com/programming-and-testing/teach-you-to-use-java-in-the-rowset.html
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
136
Exemple d’utilisation d’un RowSet
• Un (une) volontaire pour commenter ce code...
CachedRowSetImpl crs = new CachedRowSetImpl();
crs.setUrl(url);
crs.setUsername(user);
crs.setPassword(password);
crs.setType(ResultSet.TYPE_SCROLL_INSENSITIVE);
crs.setConcurrency(ResultSet.CONCUR_UPDATABLE);
crs.setCommand("SELECT * FROM AAAA");
crs.execute();
…
// Suite slide suivant
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
137
Exemple d’utilisation d’un RowSet
• Un (une) volontaire pour commenter ce code...
// voir slide précédent
while (crs.next()) {
String name = crs.getString(1);
int id = crs.getInt(2);
Clob comment = crs.getClob(3);
short dept = crs.getShort(4);
System.out.println(name + " " + id + " " + comment + " " + dept);
}
crs.setTableName("AAAA");
crs.updateShort(3, 58);
crs.updateInt(4, 150000);
crs.updateRow();
crs.acceptChanges();
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
138
Questions ?
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
139
RowSet, gestion des conflits
Que se passe t‐il lorsqu’un autre utilisateur effectue des modifications sur les données que je traite dans mon RowSet
déconnecté ? GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
140
RowSet, gestion des conflits
• Le traitement des conflits varie d’une implémentation
à une autre du RowSet déconnecté.
• Généralement, le blocage optimiste est utilisé.
– En cas de conflit, acceptChanges() lève une exception
javax.sql.rowset.spi.SyncProviderException.
– A vous de gérer les conflits selon vos cas (règles de gestion)
• L’utilisation d’un listener peut être intéressant pour
« écouter » si des changements sont effectués dans
votre RowSet.
– rowChanged()
– rowSetChanged()
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
141
RowSet, exemple de gestion des conflits
…
crs.acceptChanges();
}catch(SyncProviderException spe) {
SyncResolver resolver = spe.getSyncResolver();
int myStatus = resolver.getStatus();
switch(myStatus){
case SyncResolver.INSERT_ROW_CONFLICT :
System.out.println("Conflit à l’insertion");
break;
case SyncResolver.DELETE_ROW_CONFLICT :
System.out.println("Conflit à la suppression");
break;
case SyncResolver.UPDATE_ROW_CONFLICT :
System.out.println("Conflit à la mise à jour");
break;
}
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
142
Questions ?
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
143
Eléments clés des étudiants
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
144
Travaux pratiques
• Série 3, exercice 8
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
145
Plan de la présentation
•
SQL interactif<> SQL programmé
•
Application Programming Interface pour bases de données
•
Connexion aux bases de données avec un langage hôte
•
Statements et curseurs
•
Transactions et sessions
•
Verrous
•
Pools de connexions
•
Améliorations et limites du JDBC
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
146
Rappel: transaction = concept fondamental
Toutes applications manipulant un grand
ensemble de données, et exploitées dans un
environnement multi-utilisateurs se doit d'être
transactionnelle.
• Sans système transactionnel, la base de données
risque d’être incohérente
– Rappel des missions du SII !!
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
147
Rappel: définition d'une transaction
• Une transaction doit vérifier les propriétés
–
–
–
–
(A) Atomicité
(C) Consistance
(I) Isolation
(D) Durabilité
• Moyen mnémotechnique -> ACID
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
148
Rappel: ACID - Atomicité
• L'ensemble des opérations d'une transaction apparaît
comme une seule opération atomique
• Soit toutes les opérations sont validées ou toutes
annulées (tout ou rien)
• Cf exemple : débit/crédit
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
149
Rappel: ACID Consistance (cohérence)
• L'exécution de la transaction fait passer la base de
données d'un état consistant à un autre état
consistant (ceci en accord avec l’ensemble de la base de données
et de ses contraintes).
• Un état incohérent ne doit pas être possible !
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
150
Rappel: ACID Isolation
• Chaque transaction est indépendante des autres
transactions concurrentes.
– Semblable à une exécution en série des transactions. On
parle de « sérialisation » des transactions.
• Les concurrences sont parfaitement contrôlées
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
151
Rappel: ACID Durabilité
• C'est la persistance des mises à jour d'une
transaction validée.
• Les effets d'une transaction validée sont durables et
permanents, quelques soient les problèmes logiciels
ou matériels, notamment après la fin de la
transaction.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
152
Rappel: principales utilisations des
transactions
• Traitement des opérations sémantiquement liées
– Doit garantir le "tout ou rien"
• Exemple : débit crédit, • Soit toutes les opérations sont validées soit annulées.
•
Gestion des concurrences
•
Reprise sur pannes
– Acquisition de verrous sur les enregistrements traités,
empêchant une utilisation malencontreuse des données
– Utilisation du système transactionnel pour la reconstitution
d'un état cohérent de la base au redémarrage d'un système
après une panne, quel que soit le type de panne.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
153
Rappel: commandes SQL
• COMMIT
– Validation de la transaction
• ROLLBACK
– Annulation de la transaction
COMMIT ;
Etat cohérent
de la base
de données
i
Etat cohérent
de la base
de données
j
ROLLBACK ;
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
154
JDBC et les transactions
• Les transactions sont contrôlées avec les méthodes
commit() et rollback() de la classe Connection.
• Ne pas oublier de prendre en considération les
propriétés ACID d’une transaction!
…
Connection myConn = DriverManager.getConnection(
jdbc:oracle:thin:@NA-PO:1521:orcli1", "baudet", "*****");
myConn.setAutocommit(false);
…
myConn.commit();
…
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
155
Support des transactions par JDBC
• Certains drivers ne supportent pas les transactions.
• Vous pouvez vérifier si votre driver supporte les
transactions en utilisant la classe DatabaseMetaData.
…
DatabaseMetaData dbMetaData = myConn.getMetaData();
boolean supporteLesTransactions;
supporteLesTransactions = dbMetaData.supportTransactions();
…
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
156
AutoCommit
• Lors de la création d’une connexion, le mode autocommit est activé.
• Chaque instruction est donc considérée comme une
transaction!
• Ce principe est totalement contraire à une bonne
gestion des transactions!
• Une bonne pratique consiste à désactiver l’automyConn.setAutoCommit(false);
commit.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
157
Rappel: découpage de la transaction Oracle
• Découpage de la transaction en insérant des points
de repère (savepoint).
SAVEPOINT point ;
• Possibilité d'annulation un sous-ensemble
d'opérations de la transaction.
ROLLBACK [TO SAVEPOINT] point ;
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
158
Rappel: exemple
instruction 1 ;
SAVEPOINT toto ;
instruction 2 ;
Annulation des instructions 2 et 3
Ne termine pas la transaction !!!
instruction 3
IF test THEN
ROLLBACK TO SAVEPOINT toto ;
END IF ;
instruction 4 ; Annule la totalité de la transaction et
lâche les verrous !
instruction 5
ROLLBACK ;
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
159
JDBC et les Savepoint
• Comme pour SQL sans JDBC, il est possible d’utiliser
des Savepoints depuis JDBC 3.0.
• L’interface Savepoint permet de découper les
transactions.
instruction 1;
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
Savepoint sp1 =
myConn.setSavepoint(toto);
instruction 2;
instruction 3;
if (test) {
myConn.rollback(sp1);
}
instruction 4;
instruction 5;
myConn.rollback();
160
Java Transaction API (JTA)
• Si vous voulez aller plus loin… JTA…
• Ok, mais pas cette année…
– On l’utilisera avec un serveur d’applications l’année
prochaine.
“Java Transaction API (JTA) specifies standard Java interfaces
between a transaction manager and the parties involved in
a distributed transaction system: the resource manager, the
application server, and the transactional applications.“
Source : Oracle
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
161
Où finir la transaction ?
• ?
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
162
162
Où finir la transaction ?
• Pas après chaque commande SQL !
• Pour l’instant dans votre main (java) de façon
transactionnelle.
• L’année prochaine dans une couche logicielle
spécifique.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
163
163
Questions?
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
164
Plan de la présentation
•
SQL interactif<> SQL programmé
•
Application Programming Interface pour bases de données
•
Connexion aux bases de données avec un langage hôte
•
Statements et curseurs
•
Transactions et sessions
•
Verrous
•
Pools de connexions
•
Améliorations et limites du JDBC
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
165
JDBC et les verrous
• JDBC n’est qu’une API permettant d’utiliser votre base
de données.
• Vous pouvez (et devez!) donc utiliser les verrous de
votre DB de façon standard.
• Exemple:
Stmt = myConn.createStatement();
…
// Création de la requête
query = "SELECT * FROM PROJ_PROJET FOR UPDATE";
//sauvegarder et relâcher le verrou
myConn.commit();
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
166
Rappel: niveaux d'isolation
• Le niveau d'isolation indique le comportement de la
transaction par rapport aux autres transactions.
• Plus le niveau d'isolation est faible, plus les autres
transactions peuvent agir sur les données
concernées par la première.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
167
Rappel: niveaux d'isolation
• READ UNCOMITED
– Les verrous ne sont pas maintenus entre les instructions
 Aucune isolation, toutes les erreurs possibles.
• READ COMMITED
– Verrou exclusif maintenus jusqu'à la fin de la transaction.
Les verrous partagés ne sont pas maintenus.
 Prévient l'apparition de l'erreur de lecture inconsistante,
autres erreurs possibles
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
168
Rappel: niveaux d'isolations
• REPETABLE READ
– Les verrous partagés sont maintenus.
– Les verrous exclusifs ne sont pas maintenus
 Erreur de lecture inconsistante et non répétitive impossible,
erreur de lignes fantômes possibles.
• SERIALIZABLE
– Tous les verrous sont maintenus
 Pas de problème possible
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
169
JDBC et les niveaux d’isolation
• JDBC prévois les mêmes niveaux d’isolation!
–
–
–
–
–
TRANSACTION_NONE
TRANSACTION_READ_COMMITTED
TRANSACTION_READ_UNCOMMITTED
TRANSACTION_REPEATABLE_READ
TRANSACTION_SERIALIZABLE
• Ces niveaux d’isolations sont définis par des
constantes sur la classe Connection.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Connection myConn;
…
myConn.setTransactionIsolation(
Connection.TRANSACTION_SERIALIZABLE);
…
Cedric.Baudet@he‐arc.ch
170
Fermeture des connexions JDBC
• Une connexion à la base de données via JDBC est
fermée automatiquement via le garbage collector.
• Toutefois, afin de libérer les ressources dès que
possible, il est nécessaire de fermer correctement les
connexions.
Connection myConn;
…
myConn.close();
…
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
171
Fermeture des connexions JDBC
• Afin de s’assurer de la fermeture correcte des
connexions, une bonne pratique consiste à fermer les
connexions dans la partie finally des exceptions.
Connection myConn;
…
} finally {
try {
myConn.close();
} catch (SQLException sqlex) {
System.out.println("Erreur SQL:" + sqlex);
}
}
}
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
172
Questions ?
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
173
Eléments clés des étudiants
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
174
Travaux pratiques
• Série 3, exercice 9
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
175
Plan de la présentation
•
SQL interactif<> SQL programmé
•
Application Programming Interface pour bases de données
•
Connexion aux bases de données avec un langage hôte
•
Statements et curseurs
•
Transactions et sessions
•
Verrous
•
Pools de connexions
•
Améliorations et limites du JDBC
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
176
Réutilisation des connexions
• Réutilisation…
• Création d’une classe de connexion.
– OracleConnection
• Quelles sont ses propriétés et ses méthodes?
– Avis des étudiants
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
177
Travaux pratiques
• Série 3, exercice 10
– 15 minutes
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
178
Système de cache et de pool
• Un système de cache ou de pool permet d’éviter de
créer ou de supprimer des objets dans le but
d’améliorer les performances d’un système.
• On utilise des systèmes de cache ou pool pour:
– réutiliser des connexions à des bases de données;
– réutiliser des objets en mémoire;
• objets métiers, servlets, etc…
– réutiliser des threads;
– etc…
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
179
Pool Vs Cache
1/2
• On parle de pool pour une collection stateless
d’objets.
–
–
–
–
Pool de connexions
Pool de threads
Pool de servlets
…
• On parle de cache pour une collection stateful
d’objets.
– Entity Bean
– Session Bean stateful
– …
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
180
Pool Vs Cache
2/2
• On utilise un pool lorsque l’on veut utiliser un objet
de ce pool quel que soit cet objet. (instance de
classe!)
– Je désire obtenir une instance d’une servlet. N’importe
laquelle.
• On utilise un cache lorsque l’on veut utiliser un objet
particulier.
– Le bean xyz que j’ai dans mon cache.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
181
Pool de connexions, contexte
• Une application de gestion effectue de nombreux
appels à des sources de données. Il s’agit
généralement de bases de données relationnelles.
• De part l’architecture client/serveur et le principe de
dialogue à sessions, de nombreuses requêtes SQL
transitent sur le réseau.
• Sur le web (entre autre) et dans le cas d’utilisation
de sessions courtes, de nombreuses connexions et
déconnexions s’effectuent dans les applications.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
182
Pool de connexions
• Un pool de connexions:
– est utilisé pour éviter la création de nombreuses connexions
à une source de données;
– permet d’améliorer les performances du système.
• Le chargement des drivers JDBC est gourmand en ressources.
• Une application n’utilisant pas de pool de connexions
créée une connexion à la base de données à chaque
demande de connexion.
• Une application utilisant un pool permet de réutiliser
des connexions non utilisées.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
183
Pool de connexions
Schéma simplifié
Instances d’applications
Système de pooling
Source de données
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
184
Pool de connexion, utilisations
• Il y a plusieurs façons d’utiliser des pools de
connexions:
–
–
–
–
implémentation manuelle ;
utilisation du pool natif d’un driver JDBC ;
utilisation de librairies ;
utilisation du pool d’un serveur d’applications.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
185
Pool de connexion, implémentation manuelle
• Il s’agit d’implémenter un pool de connexions avec
de simples classes Java.
– sans librairie, sans pool de serveur d’applications.
• Avantages   désavantages:
– vous réinventez la roue ;
– vous pouvez développer le comportement exact que vous
attendez ;
– plus compliqué que d’utiliser des pools déjà développés ;
• Ceci n’est pas conseillé pour une application à mettre
en production!
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
186
Pool de connexion, pool natif d’un driver JDBC
• Il s’agit d’utiliser un pool de connexions « livré » par
le driver JDBC de votre base de données.
• Avantages   désavantages:
– Utilisation d’un pool fiable ;
– Fort couplage avec la base de données.
• Ceci n’est pas conseillé pour une application à mettre
en production!
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
187
Pool de connexion, utilisation de librairies
• Il existe des frameworks ou des librairies permettant
d’utiliser des pools de connexions.
• Citons pour JDBC:
–
–
–
–
Apache DBCP;
SourceForge c3p0 GNU Library;
SourceForge Proxool;
etc…
• Avantages   désavantages:
– utilisation d’une librairie éprouvée;
– facile d’utilisation;
– vous êtes lié avec le fournisseur de la librairie.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
188
Pool de connexion, utilisation du pool du
serveur d’applications
• Les serveurs d’applications possèdent un pool de
connexions.
– Il est possible d’utiliser ce pool de connexions dans vos
applications.
• Avantages   désavantages:
– fonctionnement éprouvé;
– facile d’utilisation;
– vous êtes lié avec le fournisseur;
• Quoique… Vous utilisez JNDI donc vous pouvez changer en tout
temps.
– ne peut être testé qu’avec le serveur d’applications.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
189
Références
• Site de Sun
– http://java.sun.com/javase/6/docs/technotes/guides/jdbc/in
dex.html
– http://java.sun.com/developer/onlineTraining/Programming/
JDCBook/conpool.html
• Site de Apache
– http://commons.apache.org/dbcp/
• Site de c3p0
• http://sourceforge.net/projects/c3p0
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
190
Questions ?
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
191
Eléments clés des étudiants
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
192
Travaux pratiques
• Série 3, exercice 11
– A terminer pour le prochain cours…
– Attention : Veuillez me faire parvenir votre diagramme de
classe et / ou votre pseudo code (avec des explications si nécessaire) en
format PDF avant le cours de la semaine prochaine via
Cyberlearn.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
193
Connexion à la base de données
• Il existe deux méthodes pour se connecter à une
base de données :
– DriverManager
– DataSource (javax.sql)
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
194
Rappel : Connexion avec la méthode
« DriverManager »
• DriverManager est utilisé depuis JDBC 1.0 et est
largement répandu dans les entreprises. C’est le
mécanisme original permettant de se connecter à
une base de données en Java.
try{
…
Connection myConn =
DriverManager.getConnection(url, user, password);
…
catch(SQLException sqle)
{
System.out.println("Erreur SQL:" + sqle);
}
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
195
DataSource
• DataSource existe depuis JDBC 2.0 et doit être
préféré à la méthode « DriverManager » car
DataSource offre quelques avantages :
– chargement explicite de driver non nécessaire ;
– facilité de maintenance ;
– capacités étendues.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
196
DataSource : chargement explicite de driver
non nécessaire
• Pas besoin de charger explicitement le driver de base
de données depuis JDBC 2.0.
• Pour rappel : les drivers doivent être chargés
explicitement à l’aide de DriverManager jusqu’à JDBC
4.0 (Java SE 6).
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
197
DataSource : facilité de maintenance
• Vous pouvez configurer une DataSource sur un
serveur d’application et la référencer dans votre code
source via JNDI.
• Ceci vous permettra d’effectuer des changements de
propriétés de votre DataSource sans changer votre
code source.
DataSource
Application cliente
Serveur d’applications
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
198
DataSource : capacités étendues
• Les connexions obtenues via une DataSource vous
permettent d’utiliser :
– des pools de connexions ;
– des transactions distribuées.
Instances d’applications
Système de pooling
Source de données
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
199
Implémentation des DataSources
• Les fournisseurs de drivers de base de données
proposent des DataSources.
• Exemples :
–
–
–
–
OracleDataSource chez Oracle ;
BasicDataSource chez Apace (DBCP) ;
SimpleDataSource, PoolingDataSource chez PostgreSQL ;
…
• Lorsqu’un objet de type DataSource est instancié,
vous pouvez obtenir une connexion à une base de
données.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
200
DataSource : exemple
try{
DataSource ds = new OracleDataSource();
/* Paramétrer la DataSource afin les infos de connexion à la BD */
((OracleDataSource)ds).setDriverType("thin");
((OracleDataSource)ds).setServerName("ne-ege-leto.ig.he-arc.ch");
((OracleDataSource)ds).setDatabaseName("ens");
((OracleDataSource)ds).setPortNumber(1521);
((OracleDataSource)ds).setUser("prof_baudet");
((OracleDataSource)ds).setPassword("*****");
…
Connection myConn = ds.getConnection();
myConn.setAutoCommit(false);
…
catch(SQLException sqle)
{
System.out.println("Erreur SQL:" + sqle);
}
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
201
DataSource et pool de connexion
1/2
• Rappel : un pool de connexions:
– est utilisé pour éviter la création de nombreuses connexions
à une source de données;
– permet d’améliorer les performances du système.
• Le chargement des drivers JDBC est gourmand en ressources.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
202
DataSource et pool de connexion
2/2
• Les connexions effectuées via une DataSource
peuvent générer un pool de connexion.
– De nombreuses librairies et serveur d’applications livrent
des pools de connexion. C’est le cas par exemple de DBCP
de Apache, d’Oracle…
• Marche à suivre :
1. création de la DataSource ;
2. création du pool de connexions ;
3. utilisation des connexions du pool.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
203
Exemple de DataSource et de pooling de
connexions
• Avec les libraires d’Oracle…
DataSource dataSource = null;
Connection myConn = null;
PooledConnection poolConn = null;
try{
dataSource = new OracleConnectionPoolDataSource ();
/* Paramétrer la DataSource avec les infos
de connexion à la BD */
…
// Création du pool de connexions
poolConn = ((OracleConnectionPoolDataSource )dataSource).getPooledConnection();
// Récupération d’une connexion du pool
myConn = poolConn.getConnection();
…
catch(SQLException sqle)…
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
204
Questions ?
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
205
Eléments clés des étudiants
• Il y a 2 méthodes pour se connecter à une BD avec
Java:
– DriverManager
– DataSource
• Avec DataSource, on a la possibilité d’obtenir
directement un pool de connexions.
• DataSource est un DriverManager plus évolué !
• Le DataSource peut ne pas être configuré directement
dans le code de l’application.
– En utilisant JNDI !
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
206
Travaux pratiques
• Série 3, exercice 12 (a, b et c)
– DataSource et pool de connexions
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
207
Plan de la présentation
•
SQL interactif<> SQL programmé
•
Application Programming Interface pour bases de données
•
Connexion aux bases de données avec un langage hôte
•
Statements et curseurs
•
Transactions et sessions
•
Verrous
•
Pools de connexions
•
Améliorations et limites du JDBC
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
208
Objectifs
• Objectifs du module
– comprendre et mettre en œuvre les services applicatifs
fondamentaux;
– développer, déployer et configurer des composants métiers
sur un serveur d’applications.
• Objectifs de l’unité d’enseignement « Dialogue avec
la base de données »
– comprendre les différences entre l'architecture "serveur de
fichiers" et "client/serveur";
– maîtriser le principe du dialogue à sessions;
– comprendre la notion de concurrence;
– savoir manipuler des données à l'aide d'un langage hôte.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
209
Concaténation de chaînes de caractères
• Les compilateurs permettent l’addition de « String »
avec l’opérateur +.
• Cet exemple est traduit par le compilateur en:
String toto = new String("Au revoir");
String titi := toto + " Nicolas";
String titi = new StringBuilder("Au revoir")
.append(" Nicolas").toString();
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
210
Problème potentiel
• Exemple de mauvaise utilisation :
public String createStringFromArray(Object[] array)
{
String _ret = new String();
for (int i = 0; i < array.length; i++)
_ret += array[i];
return _ret;
}
• Quel est le problème potentiel ?
Source : http://gfx.developpez.com/tutoriel/java/strings
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
211
Problème potentiel
• Le compilateur va traduire _ret +=array[i] par :
– _ret = _ret + array[i].
• Puis le compilateur va traduire par:
– ret = new StringBuffer(_ret).append(array[i]).toString();
• Cette ligne sera exécutée à chaque passage dans la
boucle ! Attention, l’instanciation d’objet est
coûteuse.
•  il faudra donc remplacer les opérateurs de
concaténation de chaînes de caractères par un
StringBuffer().
Source : http://gfx.developpez.com/tutoriel/java/strings
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
212
Solution
• Solution proposée :
public String createStringFromArray(Object[] array)
{
StringBuffer _buf = new StringBuffer();
for (int i = 0; i < array.length; i++)
_buf.append(array[i]);
return _buf.toString();
}
Source : http://gfx.developpez.com/tutoriel/java/strings
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
213
StringBuilder et création de query JDBC
• Afin d’améliorer les temps de réponse pour la
concaténation des « String », l’utilisation de
String.append()
de
StringBuilder
peut
être
intéressante.
• Lors de la création de queries complexes,
StringBuilder peut donc vous faire gagner du temps.
• La création dynamique de clause « where » dans une
boucle peut se révéler coûteuse…
• StringBuilder est une classe de la Java SE 5.0.
– StringBuffer peut aussi être utilisée. Cette
contrairement à StringBuilder, est synchronisée.
classe,
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
214
Les APIs de plus haut niveau
1/2
• L’utilisation de JDBC peut être critiquée.
• Des APIs de plus haut niveau permettent d’accroître
la productivité.
• Ces APIs encapsulent JDBC.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
215
Les APIs de plus haut niveau
2/2
• Ces APIs simplifient:
–
–
–
–
le chargement des drivers JDBC;
la création des connexions;
le chargement et l’exécution des requêtes;
l’exploitation des résultats (ResultSet)
• Citons:
– DbUtils, Apache Jakarta Commons
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
216
Pré-compilation ?
• Le développeur ne peut détecter les erreurs dans les
requêtes SQL qu’à l’exécution du programme…
– C’est souvent trop tard…
• Deux solutions sont possibles pour améliorer cette
situation :
– SQLJ
– Tests unitaires
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
217
SQLj
• L’idée est d’intégrer les clauses SQL directement
dans Java préfixé par un code spécifique.
• L’avantage réside dans l’étape de pré-compilation qui
permet au développeur de directement voir les
problèmes de compilation de code SQL.
– Vérification de la syntaxe SQL
– Génération de classes Java (Connection, ResultSet…)
• SQLj est peu utilisé en entreprise… Il s’agit pourtant
d’un standard ISO.
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
218
SQLj
• Exemple :
import java.sql.*;
import sqlj.runtime.*;
…
try {
#sql (UPDATE personne SET salaire = salaire + 10);
}
catch (SQLException e){…}
…
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
219
SQLj comparaison de code JDBC - SQLj
int n = 17999;
String c = "chaine a";
#sql (INSERT into EMPLOYE (:n,:c));
…
SQLj
int n = 17999;
JDBC
String c = "chaine a";
Statement stmt =
conn.preparedStatement("INSERT into EMPLOYE
values (?,? )");
stmt.setInt(1,n);
stmt.setString(2,c);
stmt.execute();
stmt.close();…
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
220
JDBC, SQLj, et l’avenir?
• JDBC est considéré comme fastidieux.
– JDBC n’est que la « prise » et devrait avoir une surcouche.
• Malheureusement SQLj n’est que peu utilisé en
entreprise…
• D’autres solutions sont actuellement préférées (qui
ne pré-compilent pas…).
– Java Data Object
– Java Persistance API
– …
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
221
Tests unitaires
• Dans un bon processus de développement, il faut
prévoir d’effectuer des tests unitaires.
• Ces tests permettent de « lever » les erreurs avant
une mise en production d’une application.
• Il faudra finir votre formation bachelor pour avoir
plus d’informations sur ce thème passionnant…
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
222
N’oubliez pas…
• Utilisez le bon driver
• Fermez les
Statements…
connexions,
les
resultSet,
les
• Optimisez à l’aide de pools de connexions
• Gérez vos transactions (setAutoCommit(false)), les
verrous…
• Ecrivez des bonnes requêtes SQL !
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
223
Questions ?
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
224
Eléments clés des étudiants
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
225
Travaux pratiques
• Série 3, exercice 13
GES-DP130227-633-2.2_Dialogue_BD_3
cba-dernière mise à jour : 03.06.2013
Cedric.Baudet@he‐arc.ch
226
Téléchargement