Aide - Recherche - Membres - Calendrier
Version complète : [servlet] Connexion SQL ? optimisation ?... euh, coincé !
Forum Développeur - Administration serveur, programmation et base de données > Programmation > Java
wox-xion
Voilà, ma servlet de gestion du contenu de site gère principalement deux chose :
-formattage du texte
-requêtes sur la base de données

Tout marche très bien, sauf que quand la servlet est initialisée, après avoir charger les informations depuis la config de web.xml, soit les informations suivantes :
-adresse jdbc
-driver jdbc
-login
-pass
et bien ça marche tant que la servlet marche, mais dès qu'elle se met en veille (pause ?), soit après un certain moment, et bien ces données de bases qui formaient la connexion con à l'initialisation de la servlet ne valent plus, et les requêtes échouent à tous les coups pour raison que la connexion ne marche plus (elle ne doit plus exister en fait)...

Voici la servlet :
CODE
/*

* ContentManager.java

*

* Created on 17. avril 2005, 00:28

*/



package org.wxw;



import java.io.*;

import java.net.*;



import javax.servlet.*;

import javax.servlet.http.*;



import java.sql.*;

import java.util.*;

import java.util.regex.*;

import java.lang.String;



/**

*

* @author xion

* @version 0.6.0

*/

public class ContentManager extends HttpServlet {

   

   private Connection con;

   private String redire, redirc;

   // connexion

   private String driver, jdbcurl, login, password;

   

   /** Initializes the servlet.

    */

   public void init(ServletConfig config) throws ServletException {

       super.init(config);

       driver = config.getInitParameter("database-driver-class");

       jdbcurl = config.getInitParameter("database-url");

       login = config.getInitParameter("database-login");

       password = config.getInitParameter("database-password");

       redirc = config.getInitParameter("redirect-url-correct");

       redire = config.getInitParameter("redirect-url-error");

       try{

           Class.forName(driver); // chargement du driver

           con = DriverManager.getConnection(jdbcurl, login, password);

       }catch(Exception e){

           throw new UnavailableException(e.getMessage());

       }

   }

   

   /** Destroys the servlet.

    */

   public void destroy() {

       try{

           con.close();

       }catch(Exception e){

           

       }

       super.destroy();

   }

   

   /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.

    * @param request servlet request

    * @param response servlet response

    */

   protected void processRequest(HttpServletRequest request, HttpServletResponse response)

   throws ServletException, IOException, SQLException, UnavailableException {

       if(con.isClosed()){

           try{

               Class.forName(driver); // chargement du driver

               con = DriverManager.getConnection(jdbcurl, login, password);

           }catch(Exception e){

               throw new UnavailableException(e.getMessage());

           }

       }

       response.setContentType("text/plain");

       String author, title, type, text, email, site;

       String sql;

       Statement st = con.createStatement();

       int newsid, res = 0;

       PrintWriter out;

       switch(Integer.parseInt(request.getParameter("mode"))){

           case 0: // post de news

               ... et tous les autres cas de gestion

       }

   }

   

   /**

    * Formattage des emails (hors texte), pour les protéger

    * @param email email à formatter / encoder

    * @return email formatté

    */

   private String formatEmail(String email){

       ...

   }

   

   /**

    * Formattage de base, lorsqu'on modifie un texte qui a déjà été formatté

    * @param base texte à formatter

    * @return texte formatté

    */

   private String formatBase(String base) throws UnsupportedEncodingException{

       ...

   }

   

   /**

    * Formattage du texte pour les news, les commentaires et les datas

    * @return retourne le texte formatté

    * @param str texte à formatter, sous forme de chaîne de caractères

    */

   private String formatText(String str) throws UnsupportedEncodingException{

       ...

   }

   

   /** Handles the HTTP <code>GET</code> method.

    * @param request servlet request

    * @param response servlet response

    */

   protected void doGet(HttpServletRequest request, HttpServletResponse response)

   throws ServletException, IOException {

       try{

           processRequest(request, response);

       }catch(Exception e){

           response.getWriter().println("Erreur " + e.getMessage());

       }

   }

   

   /** Handles the HTTP <code>POST</code> method.

    * @param request servlet request

    * @param response servlet response

    */

   protected void doPost(HttpServletRequest request, HttpServletResponse response)

   throws ServletException, IOException {

       try{

           processRequest(request, response);

       }catch(Exception e){

           response.getWriter().println("Erreur " + e.getMessage());

       }

   }

   

   /** Returns a short description of the servlet.

    */

   public String getServletInfo() {

       return "Gestionnaire de contenu de wox-xion.com";

   }

   

}


La connexion est d'abord initialisée avec la servlet, puis, après, je vérifie à chaque fois si elle est close (auquel cas je la recrée), ou toujours en marche... où fais-je faux ?

Question comme ça : est-ce que c'est un bon moyen pour gérer du contenu d'un site ou y a-t-il mieux ? (mysql doit en prendre un sacré coup si je recrée la connexion trop souvent, et surtout si elle reste active longtemps ! :?)
liguorien
salut,

ouch, il ne faut pas oublier qu'il y a un Thread différent pour chaque requête au Servlet. Donc l'accès au donnés membres doivent être synchronisés ! Le serveur risque de planter si tu as 2 requêtes silmultanée.

Ce que je te conseille, c'est d'utiliser un pool de connexion (DataSource). Celui de jakarta fait bien le boulot : http://jakarta.apache.org/commons/dbcp/.

Exemple :

CODE
import java.io.*;

import java.sql.*;

import javax.servlet.*;

import javax.servlet.http.*;

import org.apache.commons.dbcp.*;



public class ContentManager extends HttpServlet {

   

   private BasicDataSource _datasource;

   

   public void init(ServletConfig config) throws ServletException {

       super.init(config);

       

       _datasource = new BasicDataSource();

       _datasource.setDriverClassName(config.getInitParameter("database-driver-class"));

       _datasource.setUsername(config.getInitParameter("database-login"));

       _datasource.setPassword(config.getInitParameter("database-password"));

       _datasource.setUrl(config.getInitParameter("database-url"));

       _datasource.setPoolPreparedStatements(true);

   }

   

   public void destroy() {

       super.destroy();

       try{

           _datasource.close();

       }catch(Exception e){}

   }

   

   

   protected void service(HttpServletRequest request, HttpServletResponse response)

   throws ServletException, IOException {

       

       Connection conn = null;

       

       try{

           

           conn = _datasource.getConnection();

           

           //traitement de la connexion

           //il ne faut pas oublier de fermer les Statement et les ResultSet :p

           

       }catch(Exception ex){

           

       }finally{

           try{

               conn.close();

           }catch(Exception ex2){}

       }

   }

}


smile.gif
wox-xion
super, et merci pour l'info, j'avais jamais fermé un seul Statement... :oops:
ça marche pour l'instant wink.gif

par contre, c'est pas direct pour mettre en place, car après avoir mis la librairie dbcp, il fallait encore celle de pool, puis encore celle de collection, si seulement il y avait un package pour toutes les avoir en un coup ^^

encore merci beaucoup wink.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2008 Invision Power Services, Inc.