IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo

FAQ JDBCConsultez toutes les FAQ

Nombre d'auteurs : 8, nombre de questions : 162, dernière mise à jour : 3 juin 2015  Ajouter une question

 

Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums de http://www.developpez.com et de l'expérience personnelle des auteurs.

Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant rédacteur, lisez ceci.

SommaireLes pilotes - Drivers (9)
précédent sommaire suivant
 

Un pilote ou driver JDBC est un « logiciel » qui permet d'établir une connexion entre un programme Java et un système de gestion de bases de données. Ce « logiciel » est en fait une implémentation de l'interface Driver, du package java.sql. Le pont JDBC-ODBC est un exemple de driver JDBC, ce dernier permet l'interfaçage avec ODBC (il est contenu dans J2SE : sun.jdbc.odbc.JdbcOdbcDriver).

Il existe quatre types de drivers JDBC (cf. Quels sont les différents types de driver JDBC ? ) qui se différencient par leur implémentation (notamment par l'utilisation ou non de méthodes natives).

Les drivers sont pris en charge par la classe DriverManager.

Mis à jour le 11 avril 2013 Ioan

Les drivers JDBC sont disponibles sous forme de classes Java (implémentant java.sql.Driver) contenues dans des fichiers JAR (Java ARchive). L'installation est donc triviale, il suffit que le jar soit présent sur le disque dur et disponible dans le CLASSPATH durant la compilation/exécution.

Il existe quatre types de drivers JDBC :

Le pont JDBC-ODBC (JDBC-ODBC bridge plus ODBC driver) :

Ce driver est présent dans J2SE (sun.jdbc.odbc.JdbcOdbcDriver). Il permet l’accès au SGBD via le driver ODBC.

Native-API partly-Java driver :

Ce type de driver traduit les appels de JDBC à un SGBD particulier, grâce à un mélange d'API Java et d'API natives.

JDBC-Net pure Java driver :

Ce type de driver (écrit entièrement en Java) passe par un serveur intermédiaire pour l'accès au SGBD.

Native-protocol pure Java driver :

Ce type de driver (écrit entièrement en Java) se connecte directement au SGBD.

Mis à jour le 11 avril 2013 Ioan

Il est difficile de répondre de façon catégorique à cette question. En effet, les quatre types de drivers disposent de leurs avantages, inconvénients et spécificités. Mais, un ordre de préférence peut être donné en étudiant les trois critères suivants : portabilité, respect des spécifications et performances.

La portabilité : ce critère a toujours une place prépondérante dans les considérations sur le développement d'applications Java. Sur ce point, les drivers de type 3 et 4, dits « pur Java », mènent sur leurs homologues de type 1 et 2, qui utilisent des API natives. On peut, par exemple, noter l'impossibilité d'utiliser un driver de type 1 ou 2 dans une Applet.

Le respect des spécifications : ce critère est peut-être tout aussi important que le premier lors du choix d'un driver. En effet, il est toujours préférable d'avoir un driver respectant (et implémentant) les dernières spécifications. Les facilités de développement s'en voient naturellement accrues. Sur ce point, il est difficile de départager les drivers en fonction de leur type, car tout dépend de l'implémentation. On peut simplement remarquer que le pont JDBC-ODBC (driver de type 1 implémenté par Sun), un des plus populaires de son type, ne respecte que partiellement les spécifications de JDBC 3.0. De plus, la popularité (*) des drivers de type 3 et 4 laisse présager d'un développement plus suivi.

Les performances : sur ce dernier point, l'utilisation d'API natives donne en général l'avantage aux drivers de type 1 ou 2. Ceci est à pondérer par le fait que cela devient de moins en moins vrai. On peut prendre l'exemple d'Oracle qui annonce que dans « la plupart des cas » le driver Thin est aussi (voir plus) rapide que son homologue de type 2, le driver OCI.

En conclusion, nous pouvons dire que les drivers de type 3 ou 4 sont préférables à ceux de type 1 ou 2. Naturellement, ceci est une analyse rapide et la conclusion n'est pas à prendre au pied de la lettre. Prenez le temps de vous documenter et adaptez ces remarques en fonction de vos besoins.

* : environ 75 % des drivers disponibles. Observations faites sur les 210 drivers référencés sur le site de Sun en juillet 2004.

Mis à jour le 11 avril 2013 Ioan

La principale source pour trouver un driver se trouve sur le site Oracle : JDBC technology-enabled drivers

Vous pourrez affiner votre recherche en fonction de plusieurs critères :

  • version de l'API JDBC ;
  • nom du distributeur ;
  • certification J2EE ;
  • type du driver ;
  • SGBD ;
  • fonctionnalités avancées (DataSource, RowSet, etc.).

Pour trouver des informations sur un driver spécifique, la meilleure solution est de s'informer sur le site même du distributeur.

Mis à jour le 11 avril 2013 Ioan

Première méthode :

Utiliser la méthode Class.forName, qui aura pour effet d'enregistrer le Driver auprès du DriverManager. N'oubliez pas de vérifier que le jar contenant le driver est bien dans le classpath ;-)

Code java : Sélectionner tout
1
2
3
4
5
6
7
String nomDriver = "nom_du_driver"; 
try{ 
    Class.forName(nomDriver);  
}catch(ClassNotFoundException cnfe){ 
    System.out.println("La classe "+nomDriver+" n'a pas été trouvée"); 
    cnfe.printStackTrace(); 
}
En pratique, à cause d'implémentations imparfaites des spécifications, il sera parfois nécessaire d'utiliser cette syntaxe :

Code java : Sélectionner tout
Class.forName(nomDriver).newInstance();
Voici quelques exemples :

Code java : Sélectionner tout
1
2
3
4
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
//pour le pont JDBC-ODBC 
Class.forName("com.mysql.jdbc.Driver"); 
//pour MySQL et ConnectorJ
Deuxième méthode :

Enregistrer directement une instance du driver auprès du DriverManager. Par exemple :

Code java : Sélectionner tout
1
2
Driver monDriver = new com.mysql.jdbc.Driver(); 
DriverManager.registerDriver(monDriver);
Troisième méthode :

Enregistrer le driver comme un argument de la commande Java, lors de l'exécution. Cela revient en fait à définir la variable d'environnement jdbc.drivers.

Code java : Sélectionner tout
java -cp .;mesDrivers.jar -Djdbc.drivers=une.implementation.de.Driver MonMain

Mis à jour le 11 avril 2013 Ioan

Pour obtenir cette information, on peut utiliser la classe DriverManager :

Code java : Sélectionner tout
1
2
3
4
5
6
7
for (Enumeration e = DriverManager.getDrivers(); e.hasMoreElements();){ 
    Driver driver = (Driver)e.nextElement(); 
    int majorVersion = driver.getMajorVersion(); 
    int minorVersion = driver.getMinorVersion(); 
    System.out.println("Driver = "+driver.getClass()+ 
        " v"+majorVersion+"."+minorVersion); 
}

Mis à jour le 11 avril 2013 Ioan

Il faut utiliser les méthodes fournies par l'interface Driver :

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Driver driver = ...; 
String url = "url JDBC"; 
int majorVersion = driver.getMajorVersion(); 
int minorVersion = driver.getMinorVersion(); 
DriverPropertyInfo[] props = driver.getPropertyInfo(url,null); 
System.out.println("Driver class = "+driver.getClass()+ 
" v"+majorVersion+"."+minorVersion); 
for(int i=0 ;i<props.length;i++){ 
    DriverPropertyInfo prop = props[i]; 
    System.out.println("Prop name = "+prop.name); 
    System.out.println("Prop description = "+prop.description); 
    System.out.println("Prop value = "+prop.value); 
    if(prop.choices!=null){ 
        for(int j=0;j<prop.choices.length;j++){ 
            System.out.println("prop choice "+j+" = "+prop.choices[j]); 
        } 
    } 
}
Voici la sortie pour MySQL Connector/J :

Code text : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Driver class com.mysql.jdbc.Driver v3.0 
Prop name = HOST 
Prop description = Hostname of MySQL Server 
Prop value = localhost 
Prop name = PORT 
Prop description = Port number of MySQL Server 
Prop value = 3306 
Prop name = DBNAME 
Prop description = Database name 
Prop value = test 
Prop name = user 
Prop description = Username to authenticate as 
Prop value = null 
Prop name = password 
Prop description = Password to use for authentication 
Prop value = null 
Prop name = autoReconnect 
Prop description = Should the driver try to re-establish bad connections? 
Prop value = false 
prop choice 0 = true 
prop choice 1 = false 
Prop name = maxReconnects 
Prop description = Maximum number of reconnects to attempt if autoReconnect is true 
Prop value = 3 
Prop name = initialTimeout 
Prop description = Initial timeout (seconds) to wait between failed connections 
Prop value = 2 
//+ 90 lignes

Mis à jour le 11 avril 2013 Ioan

Cette fonctionnalité peut être utile durant le débogage, pour lister les interactions entre le DriverManager et tous les Drivers chargés. Il faut utiliser la méthode setLogWriter(PrintWriter out) de la classe DriverManager. Voici un exemple redirigeant ces informations sur la sortie standard :

Code java : Sélectionner tout
1
2
3
DriverManager.setLogWriter(new PrintWriter(System.out)); 
Class.forName("com.mysql.jdbc.Driver").newInstance();  
Connection connection = DriverManager.getConnection(url,user,password);
Le résultat ressemblera à ceci :

Code java : Sélectionner tout
1
2
3
4
5
6
DriverManager.initialize: jdbc.drivers = null 
JDBC DriverManager initialized 
registerDriver: driver[className=com.mysql.jdbc.Driver,com.mysql.jdbc.Driver@3fa5ac] 
DriverManager.getConnection("jdbc:mysql://localhost/test") 
trying driver[className=com.mysql.jdbc.Driver,com.mysql.jdbc.Driver@3fa5ac] 
getConnection returning driver[className=com.mysql.jdbc.Driver,com.mysql.jdbc.Driver@3fa5ac]
Attention : cette méthode obéit à des règles de sécurité, cf. doc de DriverManager.

Mis à jour le 11 avril 2013 Ioan

Pour définir le temps d'attente maximum pour établir la connexion au SGBDR, il faut utiliser une des méthodes statiques de la classe DriverManager.

Code java : Sélectionner tout
1
2
int temps = 5; // en secondes 
DriverManager.setLoginTimeout(temps);

Mis à jour le 11 avril 2013 Ioan

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.