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.
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 ? .
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 :
- Gestion d'un pool de connexions (avec Tomcat), par Christophe Jollivet
- Cours JDBC de la rubrique Java
- Description détaillée de javax.sql
- Resource Connections (J2EE 1.4 Tutorial)
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(); |
- 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.
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).
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); |
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(); //... |
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 .
Vous pouvez trouver des exemples de configuration de DataSource avec Struts dans la FAQ Struts :
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.