Pooling de connexions

Transcription

Pooling de connexions
Pooling de
connexions
Olivier Curé - UMLV [page 1 ]
Introduction
●
●
Une connexion à une base de données est une
ressource rare et coûteuse qui ne peut être
partagée par des threads.
Il faut donc réfléchir à la politique de connexions
quand on écrit une application qui utilise une
base de données :
–
quand faut-il ouvrir et fermer une connexion ?
–
faut-il garder une connexion ouverte entre 2
utilisations de la base ?
Olivier Curé - UMLV [page 2 ]
Pooling
●
●
Les choix pour une politique de
connexion sont facilités si on travaille
avec un pool de connexions déjà
ouvertes et disponibles pour les clients
Lorsque le client n’a plus besoin de la
connexion, il appelle la méthode close()
qui la restitue au pool (la connexion
n’est pas fermée)
Olivier Curé - UMLV [page 3 ]
Fonctionnement
Olivier Curé - UMLV [page 4 ]
Obtenir un pool de
connexions
●
●
On peut utiliser un des nombreux
projets « open source » qui fournit le
code pour gérer un pool de connexion
Le plus souvent un tel pool est fourni
par une source de données de type
DataSource
Olivier Curé - UMLV [page 5 ]
Source de données
●
●
●
Depuis JDBC 3 (mais déjà en extension de JDBC
2), on peut obtenir une connexion d’une
instance de javax.sql.DataSource (une interface)
au lieu de l’obtenir de la classe DriverManager
Une DataSource représente une base de
données (mais elle peut aussi représenter un
simple fichier texte)
Tout driver JDBC 2 doit fournir une
implémentation de DataSource ;
oracle.jdbc.pool.OracleDataSource pour Oracle
Olivier Curé - UMLV [page 6 ]
Java Naming Directory
Interface (JNDI)
●
●
Une API permettant d'accéder à des
services.
Création d'un répertoire où les
applications peuvent demander l'accès
à des services sans connaître certains
détails sur celui-ci (lieu de résidence,
provenance, etc.).
Olivier Curé - UMLV [page 7 ]
Java Naming Directory
Interface
●
●
A travers le server.xml de Tomcat, des
ressources JNDI peuvent être définies.
Une application Web (JEE) peut donc
accéder à des services à travers ce
service.
Olivier Curé - UMLV [page 8 ]
Configurer une
DataSource
●
●
●
●
Le plus souvent elle se configure par un fichier
XML de configuration ; voir le manuel des
logiciels que vous utilisez
Exemple : fichier server.xml de Tomcat
Dans ce cas, on place le driver dans le répertoire
$CATALINA-HOME/common/lib.
On configure la ressource JNDI factory à l'aide
des balises <Resource> et <ResourceParams>.
Olivier Curé - UMLV [page 9 ]
Exemple : Tomcat
server.xml
<Host>
...
<Resource
name="jdbc/TestDB"
auth="Container"
type="javax.sql.DataSource"/>
...
Olivier Curé - UMLV [page 10 ]
Exemple : Tomcat
server.xml (2)
<ResourceParams name="jdbc/TestBD">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataS
ource Factory
</value>
</parameter>
Olivier Curé - UMLV [page 11 ]
Exemple : Tomcat
server.xml (3)
<parameter>
<name>driverClassName</name>
<value> com.mysql.jdbc.Driver </value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:mysql://localhost/test</value>
</parameter>
Driver et nom de l'instance de la base de
données.
Olivier Curé - UMLV [page 12 ]
Exemple : Tomcat
server.xml (4)
<parameter>
<name>username</name>
<value>empro</value>
</parameter>
Username et password:
relatifs à l'utilisateur
accèdant à la base de
données.
<parameter>
<name>password</name>
<value>empass</value>
</parameter>
Olivier Curé - UMLV [page 13 ]
Exemple : Tomcat
server.xml (5)
<parameter>
<name>maxActive</name>
<value>20</value>
</parameter>
<parameter>
maxActive : nombre
maxi. de connexions
actives dans ce pool.
MaxIdle: nombre maxi.
de connexions en
attente dans ce pool.
<name>maxIdle</name>
<value>30000</value>
</parameter>
Olivier Curé - UMLV [page 14 ]
Exemple : Tomcat
server.xml (6)
<parameter>
<name>maxWait</name>
<value>100</value>
</parameter>
</ResourceParams>
MaxWait: temps maxi. (
en milliseconds)
d'attente par le
DataSource factory
d'une connexion avant
la levée d'un exception
Olivier Curé - UMLV [page 15 ]
Exemple : Tomcat web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC ...>
<web-app>
<description>TestDB</description>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/TestBD</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
Olivier Curé - UMLV [page 16 ]
Exemple : extrait JSP
<%
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup(
"jdbc/TestBD");
Connection conn = ds.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT..");
...
}
Olivier Curé - UMLV [page 17 ]
Exemple : extrait JSP (fin)
rset.close();
stmt.close();
conn.close();
ctx.close();
%>
Olivier Curé - UMLV [page 18 ]
Environnement Eclipse
europa
●
●
une copie de postgresql dans
/var/lib/tomcat5.5/common/lib
création d'un fichier context.xml dans
META-INF:
<?xml version="1.0" encoding="UTF­8"?>
<Context>
<Resource name="jdbc/postgres" auth="Container"
type="javax.sql.DataSource" username="olive" password=""
driverClassName="org.postgresql.Driver" url="jdbc:postgresql:selfr08i10"
maxActive="8" maxIdle="4"/>
</Context>
Olivier Curé - UMLV [page 19 ]
Environnement Eclipse
europa
●
Modifier le web.xml de l'application, ajouter:
●
<resource­ref>
●
<description>postgreSQL Datasource selfr08i10</description>
●
<res­ref­name>jdbc/postgres</res­ref­name>
●
<res­type>javax.sql.DataSource</res­type>
●
<res­auth>Container</res­auth>
●
</resource­ref>
●
Classe gèrant la connection à la db:
public Connection getConnection() {
Connection conn = null;
try {
InitialContext cxt = new InitialContext();
DataSource ds = (DataSource) cxt.lookup( "java:/comp/env/jdbc/postgres" );
conn = ds.getConnection();
}
catch(NamingException namingEx) {
System.out.println("naming exception: " + namingEx.getMessage());
}
catch (SQLException e) {
System.out.println("Could not connect to DB: " + e.getMessage());
}
return conn;
}
Olivier Curé - UMLV [page 20 ]