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="UTF8"?> <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: ● <resourceref> ● <description>postgreSQL Datasource selfr08i10</description> ● <resrefname>jdbc/postgres</resrefname> ● <restype>javax.sql.DataSource</restype> ● <resauth>Container</resauth> ● </resourceref> ● 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 ]