utilisation d'une datasource jdbc dans un serveur...
TRANSCRIPT
© 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
© 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
© 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
© 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.
© 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
© 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))
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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;