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.


SommaireSources de données - DataSources (7)
précédent sommaire suivant
 

Une DataSource (package javax.sql) est une interface représentant une « source de données ». Cette « source de données » est en fait une simple fabrique de connexions vers la source de données physique. Ce mécanisme, apparu avec JDBC 3.0, est désormais préféré au DriverManager. Pour connaître les raisons de cette préférence et les atouts de DataSource, regardez : Pourquoi utiliser une DataSource ? .

En général, une DataSource est utilisée (appelée) via JNDI (Java Naming and Directory Interface). Mais, ce n'est pas une obligation, c'est simplement ce qui est le plus couramment rencontré.

Il existe trois grands types d'implémentations pour une DataSource :

  • Basiques : ces implémentations produisent des instances de Connection normales, telles que l'on pourrait les obtenir avec DriverManager ;
  • Pool de connexions : ces implémentations produisent des instances de Connection qui appartiennent à un pool. Pour savoir à quoi cela correspond exactement, regardez : Qu'est-ce qu'un pool de connexions ? ;
  • Transactions distribuées : ces implémentations produisent des instances de Connection, qui peuvent être utilisées pour des transactions distribuées. En général, ce type de DataSource utilise aussi les pools de connexions.

Pour savoir où trouver des implémentations de dataSource, regardez : Où trouver des implémentations de DataSource ? .

Mis à jour le 11 avril 2013 Ioan

L'accès à une base de données via une DataSource est un mécanisme désormais préféré au DriverManager. Voici quelques raisons à cette « préférence » :

  • les drivers ne sont plus obligés de s'enregistrer eux-mêmes, comme ils le faisaient avec DriverManager ;
  • les implémentations de DataSource permettent de facilement changer les propriétés des sources de données. Par exemple, il n'est plus nécessaire de modifier du code applicatif lors de changements concernant la base de données, son emplacement physique ou encore un driver ;
  • les instances de Connection fournies par les DataSouce ont des capacités étendues (pool de connexion, transactions distribuées, etc.).

Il y a d'autres avantages à utiliser les DataSource. Pour des informations plus détaillées, vous pouvez suivre ces liens :

Mis à jour le 11 avril 2013 Ioan

Un pool de connexions est un mécanisme permettant de réutiliser les connexions créées. En effet, la création systématique de nouvelles instances de Connection peut parfois devenir très lourd en consommation de ressources. Pour éviter cela, un pool de connexions ne ferme pas les connexions lors de l'appel à la méthode close(). Au lieu de fermer directement la connexion, celle-ci est « retournée » au pool et peut être utilisée ultérieurement.

La gestion du pool se fait en général de manière transparente pour l'utilisateur.

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
//récupération d'une DataSource, via JNDI d'habitude 
DataSource source = ...;  
//récupération d'une connexion du pool 
Connection connection = source.getConnection("user", "password"); 
//utilisation de la Connection 
  
// ... 
  
//on "retourne" la connexion au pool, en la "fermant" 
connection.close();
Voici les quelques classes concernant les pools de connexions du package javax.sql :

  • ConnectionPoolDataSource : cette interface représente une source de données gérant les pools de connexions ;
  • PooledConnection : cette interface représente une connexion appartenant à un pool ;
  • ConnectionEventListener : ce listener permet de se mettre à l'écoute des événements relatifs à une PooledConnection. La méthode connectionClosed(ConnectionEvent event) est appelée lorsqu'une connexion est retournée au pool. La méthode connectionErrorOccurred(ConnectionEvent event) est appelée lors d'une erreur lors de la connexion (crash du serveur, par exemple). Le listener est « prioritaire » par rapport à l'application (i.e. les méthodes sont appelées avant que le driver informe l'application d'une SQLException) ;
  • ConnectionEvent : cette classe représente un événement de ConnectionEventListener. Deux informations sont accessibles à partir de cet événement : la PooledConnection (source) et la SQLException, si elle existe.

Attention, aucune méthode de javax.sql ne retourne directement uneConnectionPoolDataSource. Pour pouvoir utiliser les méthodes spécifiques de cette interface, vous devrez faire vous-même le « casting » adéquat.

Suivez les liens ci-dessous pour des exemples pratiques de création et d'utilisation d'un pool de connexions.

Mis à jour le 11 avril 2013 Ioan

De nombreuses implémentations de DataSource existent. Celles-ci sont fournies par les fournisseurs de Driver ou de manière indépendante (comme DBCP). Voici quelques exemples et liens :

  • DBCP (Database Connection Pool) : cette API du projet Jakarta Commons permet d'obtenir des implémentations de DataSource avec pool de connexions. Elle est intégrée et utilisée par de nombreux projets (Tomcat par exemple) ;
  • JDBC-ODBC Bridge : le pont JDBC-ODBC proposé par Sun propose aussi des implémentations de DataSource. Pour plus d'informations, suivez ce lien : http://java.sun.com/j2se/1.5.0/docs/...bc/bridge.html ;
  • il existe de nombreux projets open source comme proxool ou encore c3p0 ;
  • de très nombreux distributeurs de drivers fournissent leurs propres implémentations (MySQL, Oracle, Sybase, etc.). Pour une liste détaillée, regardez JDBC technology-enabled drivers (sélectionnez simplement Conn.Pooling et/ou DataSource pour les fonctionnalités requises).

Mis à jour le 11 avril 2013 Ioan

Voici un exemple de configuration d'une DataSource avec l'API DBCP. Pour cet exemple, on va utiliser JNDI, mais vous pouvez très bien utiliser directement l'implémentation (BasicDataSource).

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//initialisation du contexte 
System.setProperty(Context.INITIAL_CONTEXT_FACTORY, 
      "com.sun.jndi.fscontext.RefFSContextFactory"); 
InitialContext ic = new InitialContext(); 
  
// création d'une référence sur la DataSource 
Reference ref = new Reference("javax.sql.DataSource", 
      "org.apache.commons.dbcp.BasicDataSourceFactory", 
      null); 
ref.add(new StringRefAddr("driverClassName", "com.mysql.jdbc.Driver")); 
ref.add(new StringRefAddr("url", "jdbc:mysql://localhost/mabase")); 
ref.add(new StringRefAddr("username", "xxx")); 
ref.add(new StringRefAddr("password", "xxx")); 
  
//liaison de la DataSource au contexte 
ic.rebind("jdbc/MaDataSource", ref);
Une fois ce lien créé, il ne vous reste plus qu'à récupérer la DataSource comme ceci :

Code java : Sélectionner tout
1
2
3
4
5
6
7
//récupération de la DataSource à partir du contexte 
Context ctx = new InitialContext(); 
DataSource source = (DataSource)ctx.lookup("jdbc/MaDataSource"); 
  
//récupération d'une Connection 
Connection connection = source.getConnection(); 
//...
Vous pouvez trouver d'autres exemples d'utilisation de DBCP à ces adresses :

Mis à jour le 11 avril 2013 Ioan

Pour savoir comment configurer un pool de connexions avec Tomcat, vous pouvez lire le tutoriel de Christophe Jollivet : Gestion d'un pool de connexions SGBD par Tomcat.

D'autres exemples sont disponibles pour DBCP et Tomcat dans la documentation de celui-ci : JNDI Datasource HOW-TO .

Mis à jour le 11 avril 2013 Ioan

Vous pouvez trouver des exemples de configuration de DataSource avec Struts dans la FAQ Struts :

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 © 2017 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.

 
Responsables bénévoles de la rubrique Java : Mickael Baron - Robin56 -