Logo 6tech
Accueil du site > Tutoriaux > Pool de connexion

Pool de connexion

La gestion des base de données sous Struts est un vrai problème. Les tags du framework ( tel <sql:setDataSource> ) commence à perturber l’idée originelle de Struts. Struts n’est qu’un framework de présentation, et le fait de lui permettre de gérer les bases de données revient à mélanger les différentes couches d’une application MVC2 . Il est donc conseillé de ne pas utiliser cette librairie de tag ( qui devrait disparaître dans les versions futures )

Une meilleur approche serait de configurer la gestion de ses bases de données par tomcat lui même grâce encore une fois au fameux fichier de context : /META-INF/context.xml . Quelques lignes permettront de peaufiner toute une gestion tel que le nombre de connexion maximale, le nombre minimal à prévoir, le timeout, etc. Ce que l’on appel un pool de connexion !

 Configuration du pool

La configuration commence donc par ces quelques lignes dans un fichier context.xml :

<Context reloadable="true">
        <Resource name="jdbc/myProject" auth="Container"
                type="javax.sql.DataSource"
                username="database_user" password="database_passwd"
                driverClassName="com.mysql.jdbc.Driver"
                url="jdbc:mysql://localhost:3306/database_base" maxActive="8" maxIdle="8"
                removeAbandoned="true" removeAbandonedTimeout="30" logAbandoned="true" />
</Context>

Pour la signification des attributs je vous suggère d’aller voir : common apache

 Lier le pool à l’application

Une fois ce pool créé, il peut être intéressant de le lier à l’application dans son fichier web.xml par la balise resource-ref :

        <resource-ref>
                <description>
                        Pool de connexion à la base de données
                </description>
                <res-ref-name>jdbc/myProject</res-ref-name>
                <res-type>javax.sql.DataSource</res-type>
                <res-auth>Container</res-auth>
        </resource-ref>

 L’utilisation dans vos servlets

Ensuite pour l’utiliser, il vous suffira de récupérer une connexion du context par ces quelques lignes :

        try {
                Context initCtx = new InitialContext(); // récupération du context
                DataSource ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/myProject"); // récupération de la source
                Connection con = ds.getConnection(); // récupération de la connexion
                .....
        } catch (Exception e) {
                Logger.getLogger(this.CLASS).error("DATABASE : "+e.getMessage());
        }

Il pourra être subtil de créer une classe s’occupant de récupérer cette connexion et d’effectuer une requête dessus.

 Erreurs fréquentes

Attention toute fois à bien comprendre ce que vous faites. La création d’un pool de connexion et sa limitation implique de fermer correctement toute demande de connexion une fois la requête achevée. Un appel à con.close() terminera la connexion courrante, mais prenez garde à bien fermer vos ResultSet et PreparedStatement dans le bon ordre et avant la fermeture de la connexion principale.

Si votre script se bloque ou se met en pause ; cela est généralement du à l’oubli de fermeture de connexion. Le pool de connexion voyant son capital de connexions s’amenuiser, ne distribuera plus de nouvelles connexions tant que les précédentes n’auront pas été libérées ..

 Dernières précisions

  • Si vraiment, vraiment, vraiment vous préférez quand même, contre toute opposition sensée et argumentée, utiliser la taglib ’sql’ de struts, vous pouvez en haut de vos pages renseigner la source précédemment configurée dans le web.xml et dans le context.xml par <sql:setDataSource dataSource="jdbc/myProject" />
  • Vous pouvez également vouloir configurer un pool de connexion au niveau du serveur tomcat directement, et partager ce pool avec plusieurs applications en créant une section ressource dans le server.xml (plus facilement faisable par l’administration de tomcat ) ; ensuite il conviendra de spécifier dans chaque contexte le pool à utiliser par :
    <ResourceLink
                    name="jdbc/myProject"
                    global="jdbc/myProject"
                    type="javax.sql.DataSource"/>

Cette solution écarte l’étape de configuration du web.xml

bas de page Contact - EIC 6tech  - SIRET : 479 088 270 00018 - Tel: 0870 406 988 - © 2008