Utilisation d'une DataSource JDBC dans un serveur...

14
© Philippe GENOUD UJF 1 © Philippe GENOUD UJF 1 © Philippe GENOUD UJF Février 2018 1 Utilisation d'une DataSource JDBC dans un serveur TOMCAT Philippe Genoud dernière modification : 08-02-2018

Transcript of Utilisation d'une DataSource JDBC dans un serveur...

Page 1: Utilisation d'une DataSource JDBC dans un serveur TOMCATlig-membres.imag.fr/genoud/ENSJAVA/cours/supportsPDF/... · 2018-02-08 · Pour les applications JEE (Java Entreprise Edition)

© Philippe GENOUD UJF Février 2018 1© Philippe GENOUD UJF Janvier 2013 1© Philippe GENOUD UJF Février 2018 1

Utilisation d'uneDataSource JDBC

dans un serveur TOMCAT

Philippe Genoud

dernière modification : 08-02-2018

Page 2: Utilisation d'une DataSource JDBC dans un serveur TOMCATlig-membres.imag.fr/genoud/ENSJAVA/cours/supportsPDF/... · 2018-02-08 · Pour les applications JEE (Java Entreprise Edition)

© Philippe GENOUD UJF Février 2018 2

javax.sql

javax.sql package d’extension standard de JDBC

Pour les applications JEE (Java Entreprise Edition)

Inclus en standard dans JSE (Java Standard Edition) depuis version 1.4

DataSource : Obtention du nom de la base à partir de serveurs de noms plutôt que d’avoir le nom de la base de données codé « en dur » dans l’application.

Utilisation de JNDI (Java Naming and Directory Interface) pour connexion à une base de donnée

PooledConnection : support pour gestion d’un « pool » de connexion

gestion d’un cache des connexion ouvertes

évite la création de nouvelles connexions (ce qui est coûteux)

RowSet : permet de traiter les résultats des requêtes comme des composants JavaBeans

Support pour les transactions distribuées

Page 3: Utilisation d'une DataSource JDBC dans un serveur TOMCATlig-membres.imag.fr/genoud/ENSJAVA/cours/supportsPDF/... · 2018-02-08 · Pour les applications JEE (Java Entreprise Edition)

© Philippe GENOUD UJF Février 2018 3

javax.sql.DataSource L'objet DataSource avec pooling de connexions maintient un ensemble de connexions à

la BD prêtes à l'emploi (pool ou cache de connexions*).

Objet DataSource

Objets Connectionen fait PooledConnection

* Understanding JDBC Connection Pooling, Manoj Debnath, May 19, 2017http://www.developer.com/java/data/understanding-jdbc-connection-pooling.html

Page 4: Utilisation d'une DataSource JDBC dans un serveur TOMCATlig-membres.imag.fr/genoud/ENSJAVA/cours/supportsPDF/... · 2018-02-08 · Pour les applications JEE (Java Entreprise Edition)

© Philippe GENOUD UJF Février 2018 4

javax.sql.DataSource L'objet DataSource avec pooling de connexions maintient un ensemble de connexions à

la BD prêtes à l'emploi (pool ou cache de connexions*).

Objet DataSource

Objets Connectionen fait PooledConnection

Quand un code a besoin d'accéder à la base de données, il obtient une connexion en s'adressant à la DataSource

DataSource ds;...Connection c = ds.getConnnection();...

connexion retirée du pool et mise à disposition de l'application

c

Il conserve la connexion jusqu'à sa "fermeture" explicite.

Page 5: Utilisation d'une DataSource JDBC dans un serveur TOMCATlig-membres.imag.fr/genoud/ENSJAVA/cours/supportsPDF/... · 2018-02-08 · Pour les applications JEE (Java Entreprise Edition)

© Philippe GENOUD UJF Février 2018 5

javax.sql.DataSource L'objet DataSource avec pooling de connexions maintient un ensemble de connexions à

la BD prêtes à l'emploi (pool ou cache de connexions*).

Objet DataSource

Objets Connectionen fait PooledConnection

Quand un code a besoin d'accéder à la base de données, il obtient une connexion en s'adressant à la DataSource

DataSource ds;...Connection c = ds.getConnnection();...

connexion retirée du pool et mise à disposition de l'application

c

Il conserve la connexion jusqu'à sa "fermeture" explicite.

Lorsqu'une connexion est "fermée", elle est en fait relâchée et remise dans le pool.

c.close();connexion remise dans le pool

Page 6: Utilisation d'une DataSource JDBC dans un serveur TOMCATlig-membres.imag.fr/genoud/ENSJAVA/cours/supportsPDF/... · 2018-02-08 · Pour les applications JEE (Java Entreprise Edition)

© Philippe GENOUD UJF Février 2018 6

Définir un pool de connexion avec TomCat

javax.sql.DataSource = pool de connexions

Interface dans javax.sql.DataSource

Objet DataSource pris en charge par le serveur TomCat

org.apache.commons.dbcp.BasicDataSource

Créé par le serveur Tomcat à partir de paramètres de configuration

ressource globale à un contexte (ressource partagée par toutes les sessions d'une même application)

– description dans le fichier context.xml de l'application

ressource globale partagée par tous les contextes (toutes les applications)

– description dans le fichier server.xml

Mis à disposition des applications par un serveur d’objets :

on récupère l'objet DataSource créé et géré par le conteneur au travers d'un identificateur (API JNDI (Java Naming Directory Interface))

Page 7: Utilisation d'une DataSource JDBC dans un serveur TOMCATlig-membres.imag.fr/genoud/ENSJAVA/cours/supportsPDF/... · 2018-02-08 · Pour les applications JEE (Java Entreprise Edition)

© Philippe GENOUD UJF Février 2018 7

Définir un pool de connexion avec Tomcat

Définition d'une ressource de type DataSource pour le contexte de l'application

dans le fichier de configuration context.xml de l'application

Documentation de Tomcat

https://tomcat.apache.org/tomcat-8.5-

doc/jndi-datasource-examples-howto.html

Désignation cette ressource dans le fichier de déploiement de l'application

dans le fichier web.xml de l'application

Installer le pilote JDBC

dans le répertoire lib de Tomcat

Page 8: Utilisation d'une DataSource JDBC dans un serveur TOMCATlig-membres.imag.fr/genoud/ENSJAVA/cours/supportsPDF/... · 2018-02-08 · Pour les applications JEE (Java Entreprise Edition)

© Philippe GENOUD UJF Février 2018 8

Définir un pool de connexion avec Tomcat

<Context path="/NomContexteAppli">

<Resource name="jdbc/NomDeLaDataSource" auth="Container" type="javax.sql.DataSource"maxTotal="10" maxIdle="3" maxWaitMillis="10000"username="genoudph" password="xxxxxxx" driverClassName="oracle.jdbc.OracleDriver"url="jdbc:oracle:thin:@im2ag-oracle.e.ujf-grenoble.fr:1521:im2ag"/>

</Context>

context.xml

Paramétrage du pool de connexion*

Paramétragede la connexion JDBC

* https://tomcat.apache.org/tomcat-8.5-doc/jndi-datasource-examples-howto.html#Database_Connection_Pool_(DBCP_2)_Configurations

Définition d'une ressource de type DataSource pour le contexte de l'application

dans le fichier de configuration context.xml de l'application

Désignation cette ressource dans le fichier de déploiement de l'application

dans le fichier web.xml de l'application

Installer le pilote JDBC

dans le répertoire lib de Tomcat

1

Page 9: Utilisation d'une DataSource JDBC dans un serveur TOMCATlig-membres.imag.fr/genoud/ENSJAVA/cours/supportsPDF/... · 2018-02-08 · Pour les applications JEE (Java Entreprise Edition)

© Philippe GENOUD UJF Février 2018 9

Définir un pool de connexion avec Tomcat

web.xml

Définition d'une ressource de type DataSource pour le contexte de l'application

dans le fichier de configuration context.xml de l'application

Désignation cette ressource dans le fichier de déploiement de l'application

dans le fichier web.xml de l'application

Installer le pilote JDBC

dans le répertoire lib de Tomcat

2

...<servlet-mapping>

...</servlet-mapping>

<resource-ref><res-ref-name>jdbc/NomDeLaDataSource</res-ref-name><res-type>javax.sql.DataSource</res-type><res-auth>Container</res-auth>

</resource-ref>

...

si on utilise @Resourcepour accéder à la datasource depuis le code java

Page 10: Utilisation d'une DataSource JDBC dans un serveur TOMCATlig-membres.imag.fr/genoud/ENSJAVA/cours/supportsPDF/... · 2018-02-08 · Pour les applications JEE (Java Entreprise Edition)

© Philippe GENOUD UJF Février 2018 10

Définir un pool de connexion avec Tomcat

Définition d'une ressource de type DataSource pour le contexte de l'application

dans le fichier de configuration context.xml de l'application

Désignation cette ressource dans le fichier de déploiement de l'application

dans le fichier web.xml de l'application

Installer le pilote JDBC

dans le répertoire lib de Tomcat3

ojdbc7.jar

apache-tomctat-8.0.27_base

8.02

ojdbc7.jar

Si vous lancez Tomcat depuis Netbeans et que vous n'avez pas le droit d'écriture dans le répertoire d'installation de Tomcat vous pouvez configurer l'instance de Tomcat que vous utilisez à l'aide des fichiers contenus dans le répertoire .netbeans qui se trouve sur votre compte

Page 11: Utilisation d'une DataSource JDBC dans un serveur TOMCATlig-membres.imag.fr/genoud/ENSJAVA/cours/supportsPDF/... · 2018-02-08 · Pour les applications JEE (Java Entreprise Edition)

© Philippe GENOUD UJF Février 2018 11

Définir un pool de connexion avec Tomcat

Définition d'une ressource globale partagée par tous les contextes

Description dans le fichier de configuration du serveur ($CATALINA_HOME/conf/server.xml)

...<GlobalNamingResources>

<Environmentname="simpleValue"type="java.lang.Integer"value="30"/>

<Resourceauth="Container"description="User database that can be updated and saved"name="UserDatabase"type="org.apache.catalina.UserDatabase"pathname="conf/tomcat-users.xml"factory="org.apache.catalina.users.MemoryUserDatabaseFactory"/>

<Resourcename="jdbc/NomDeLaDataSource"type="javax.sql.DataSource"driverClassName="com.mysql.jdbc.Driver"password="xyyyyyyy"maxIdle="2"maxWait="5000"username="genoud"url="jdbc:mysql://localhost/essai"maxActive="4"/>

</GlobalNamingResources>...

1

Page 12: Utilisation d'une DataSource JDBC dans un serveur TOMCATlig-membres.imag.fr/genoud/ENSJAVA/cours/supportsPDF/... · 2018-02-08 · Pour les applications JEE (Java Entreprise Edition)

© Philippe GENOUD UJF Février 2018 12

Définir un pool de connexion avec Tomcat

Définition d'une ressource globale partagée par tous les contextes

Déclaration d'un lien pour chaquecontexte qui peut y accéder (fichier context.xml des applications concernées)

2

context.xml de l'application

3 Désignation cette ressource dans le fichier de déploiement (web.xml) de l'application

web.xml de l'application

4 Ne pas oublier d'installer le pilote jdbc dans le répertoire lib de tomcat

ojdbc7.jar

Page 13: Utilisation d'une DataSource JDBC dans un serveur TOMCATlig-membres.imag.fr/genoud/ENSJAVA/cours/supportsPDF/... · 2018-02-08 · Pour les applications JEE (Java Entreprise Edition)

© Philippe GENOUD UJF Février 2018 13

connexion à la BD

Utilisation de la source de données dans le code java en utilisant API JNDI

public class MaServlet extends HttpServlet {/*** la source de données qui permettra d'accéder à la base de donnée* (c'est elle qui gère un pool de connexions, et qui fournira les* connexions aux différents objets en ayant l'usage).*/private DataSource dataSource;

/*** A l'initialisation du servlet, récupération de l'objet Data Source.*/public void init() throws ServletException {

try {Context initialCtxt = new InitialContext();

dataSource = (DataSource) initialCtxt .lookup("java:comp/env/jdbc/NomDeLaDataSource");}catch (NamingException ne) {

throw new ServletException("problème lors du chargement de la data source", ne);}

}...

try (Connection conn = dataSource.getConnection()) {... code JDBC ...

}...

}

import javax.naming.*

Le nom de la DataSource

Page 14: Utilisation d'une DataSource JDBC dans un serveur TOMCATlig-membres.imag.fr/genoud/ENSJAVA/cours/supportsPDF/... · 2018-02-08 · Pour les applications JEE (Java Entreprise Edition)

© Philippe GENOUD UJF Février 2018 14

connexion à la BD

public class MaServlet extends HttpServlet {/*** la source de données qui permettra d'accéder à la base de donnée* (c'est elle qui gère un pool de connexions, et qui fournira les* connexions aux différents objets en ayant l'usage).*/

private DataSource dataSource;/*** A l'initialisation du servlet, récupération de l'objet Data Source.*/public void init() throws ServletException {

try {Context initialCtxt = new InitialContext();

dataSource = (DataSource) initialCtxt .lookup("java:comp/env/jdbc/NomDeLaDataSource");}catch (NamingException ne) {

throw new ServletException("problème lors du chargement de la data source", ne);}

}...

try (Connection conn = dataSource.getConnection()) {... code JDBC ...

}...

}

import javax.naming.*

Le nom de la DataSource

Utilisation de la source de données dans le code java en utilisant injection de dépendance (JEE6+)

@Resource(name = "jdbc/UFRIMA") possibilité d'injecter directement la ressource avec annotation @Resource

Pour en savoir plus https://docs.oracle.com/javaee/7/tutorial/injection001.htm#BABHDCAI

import javax.annotation.Resource;