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.
- Comment ouvrir une connexion à une base de données (DriverManager) ?
- Comment sont formées les URL JDBC ?
- Comment fermer une connexion ?
- Comment savoir si une connexion est fermée ?
- Comment savoir qu'une connexion est valide ?
- Comment être sûr de bien fermer les ressources à la fermeture d'une connexion ?
Une connexion à une base de données avec JDBC est représentée par une instance de la classe java.sql.Connection. Pour ouvrir une connexion vers une base de données, il suffit de spécifier l'URL de connexion, le login et le password, à la méthode getConnection de DriverManager. Par exemple :
Code java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 | String URL = "URL"; String login = "log"; String password = "pass"; try{ Connection connection = DriverManager.getConnection(URL,login,password); //interaction avec la base } catch(SQLException sqle){ //cf. Comment gérer les erreurs ? } finally{ //cf. Comment bien fermer une connexion ? } |
Code java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | String login = "log"; String password = "pass"; try{ Properties props = new Properties(); props.setProperty("user","userName"); props.setProperty("password","motDePasse"); props.setProperty("autoReconnect", "true"); Connection connection = DriverManager.getConnection(URL,props); //interaction avec la base } catch(SQLException sqle){ //cf. Comment gérer les erreurs ? } finally{ //cf. Comment bien fermer une connexion ? } |
Les URL JDBC sont définies sous forme de String selon ce schéma :
Code java : | Sélectionner tout |
String url = "jdbc:<subprotocol>:<subname>"
- <jdbc> : le protocole dans une URL JDBC est toujours jdbc.
- <subprotocol> : cela correspond au nom du driver ou au mécanisme de connexion à la base de données.
- <subname> : une manière d'identifier la source de données. Ce dernier élément dépend complètement du sous-protocole et du driver.
Par exemple :
- jdbc:odbc:maBase;CacheSize=30;ExtensionCase=LOWER
- jdbc:mysql://localhost/maBase
- jdbc:oracle:oci8@:maBase
- jdbc:oracle:thin:@localhost:8000:maBase
- jdbc:sybase:Tds:localhost:5020/maBase
Il est nécessaire de se documenter auprès du fournisseur du driver.
La connexion est fermée automatiquement par le garbage collector, mais il est toujours préférable de fermer soi-même une connexion. De manière générale, il est nécessaire de bien gérer les exceptions. Votre code devrait toujours ressembler à ceci :
Code java : | 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 | String driver = "nom.du.driver"; String url = "url"; String login = "login" String password = "password"; Connection connection = null; try{ Class.forName(driver); connection = DriverManager.getConnection(url,login,password); //travail avec les données } catch(ClassNotFoundException cnfe){ System.out.println("Driver introuvable : "); cnfe.printStackTrace(); } catch(SQLException sqle){ System.out.println("Erreur SQL : "); //Cf. Comment gérer les erreurs ? } catch(Exception e){ System.out.println("Autre erreur : "); e.printStackTrace(); } finally { if(connection!=null){try{connection.close();}catch(Exception e){e.printStackTrace();}} //etc. } |
Pour savoir si la connexion est fermée, il faut utiliser la méthode isClosed() de Connection. Par exemple :
Code java : | Sélectionner tout |
1 2 3 4 5 6 | if(connection.isClosed()){ //on essaye de réinitialiser la connexion connection = DriverManager.getConnection(...); }else{ //traitement normal } |
La méthode isClosed de Connection n'est pas suffisante pour tester la validité d'une connexion. En effet celle-ci retourne true si, et seulement si, la méthode close a été appelée. La seule possibilité reste de faire une sorte de « ping » vers le serveur. Ce « ping » consiste en l'exécution d'une requête simple. Par exemple :
Code java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public static boolean isValid(Connection connection){ if(connection==null){ return false; } ResultSet ping = null; try{ if(connection.isClosed()){return false;} ping = connection.createStatement().executeQuery("SELECT 1"); return ping.next(); }catch(SQLException sqle){ return false; } finally{ if(ping!=null){try{ping.close();}catch(Exception e){}} } } |
Il n'est pas forcément simple de savoir si tous les objets liés à sa requête sont fermés dans le bon ordre et au bon moment.
Avec Java 7, la structure try-with-resources permet de répondre à cette problématique. La liste des objets déclarés dans le bloc try seront alors fermés automatiquement (s'ils implémentent Closable ou AutoClosable).
Voici un exemple :
Code Java : | Sélectionner tout |
1 2 3 4 5 6 7 8 | public void myRequest(Connection cnx, String query) throws SQLException { try (Statement stmt = cnx.createStatement(); ResultSet rs = stmt.executeQuery(query);) { while (rs.next()) { // faire de qu'on doit faire avec les résultats } } } |
Voici un second exemple permettant de gérer les exceptions SQL directement dans la méthode :
Code Java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | public void myRequest(Connection cnx, String query) { try (Statement stmt = cnx.createStatement(); ResultSet rs = stmt.executeQuery(query);) { while (rs.next()) { // faire de qu'on doit faire avec les résultats } } catch (SQLException e){ // gérer les erreurs Throwable[] t = e.getSuppressed(); // erreurs qui arrivent pendant la fermeture des ressources (stmt.close ou rs.close) si une autre erreur a eu lieu avant. } } |
Il est possible de mettre autant d'éléments que l'on souhaite dans le try tant que les objets créés implémentent Closable ou AutoClosable. Les éléments sont fermés à la fin de l'exécution du bloc try dans l'ordre inverse de leur déclaration.
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.