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.
- Qu'est-ce qu'un driver ?
- Quels sont les différents types de driver JDBC ?
- Quel(s) driver(s) utiliser ?
- Où trouver des drivers ?
- Comment charger un driver ?
- Comment connaître les drivers disponibles à partir d'une application ?
- Comment obtenir des informations sur un Driver donné, à partir de l'application ?
- Comment rediriger les logs du DriverManager ?
- Comment définir le temps d'attente pour une connexion ?
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.
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.
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.
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.
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(); } |
Code java : | Sélectionner tout |
Class.forName(nomDriver).newInstance();
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 |
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); |
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
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); } |
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]); } } } |
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 |
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); |
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] |
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); |
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 çaLes 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.