IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tomcat et TomEE Java Discussion :

[ Tomcat ] Couper tout lien physique entre BD et la Servlet.


Sujet :

Tomcat et TomEE Java

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 58
    Points : 48
    Points
    48
    Par défaut [ Tomcat ] Couper tout lien physique entre BD et la Servlet.
    Bonjour depuis quelques temps je suis sur un probleme de communication link failure -> j'ai installé et configuré c3p0 mais apparement mon probleme viendrait d'autre part.

    Je viens de m'apercevoir que dans ma servlet je crée une instance d'un PersistanceManager dans lequel se trouve toutes mes requtes SQL et qu'à aucun moment je ne ferme la connexion récupéré à travers mon DataSource, cela est peut etre la cause du communication link failure ?? Pour moi normalement la connection est fermé automatiquent mais bon j'aimerait avoir votre avis. Est il vraiment nécessaire de fermer connexion, statement et resultset apres avoir chaque requete ??

    Je suis en train de répertorier tout les liens physiques qu'il faut couper avec la BD afin de ne plus avoir ce communication link failure... pas simple

  2. #2
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Points : 3 510
    Points
    3 510
    Billets dans le blog
    2
    Par défaut
    oui, il faut terminer correctement toutes tes requêtes et fermer tes connexions à un moment donné.
    Je ne me souviens plus mais il y a peut être un timeout au niveau d'une connexion JDBC ou tout simplement côté BD ?!

  3. #3
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    Non ni la session, ni la connection ne sont fermée automatiquement. Même pas le resultset. Apres cela depend du SGBD mais avec oracle et c3p0 si tu ne fermes pas les session. C3p0 instancie de nouvelle sessions jusqu'a epuisement du pool et apres c'est le deadlock, toutes les connections sont en wait() et tu es bon pour redémarrer.
    Steve Hostettler
    est ton ami(e) et le tag aussi.

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 58
    Points : 48
    Points
    48
    Par défaut
    Bon ok pour le moment ca semble pas trop mal tourner en fermant bien mes connexions et statements, la reconnexion se fait à la fin du wait_timeout MySQL.

    Par contre j'ai rencontré un pti souci :
    Si je fermais statements et connexions apres chaque requete Tomcat plantait (gros flood, en plus sans exception), j'ai donc ouvert une connexion et un statement en début du doPost que je ferme à la fin de delui-ci et la probleme n'est plus survenu.

    Vous vous y prenez comment pour ouvrir et fermer vos connexions ?
    vous faites ca pour chaque requete SQL ou pour chaque requete provenant du post (genre listerProduit = ensemble de requetes)?

    C'est vrai que je développe en java depuis 2 ans mais je débute dans le monde de l' entreprise et c'est bien différent ... quand ont met en production une appli il y a plein de choses a prendre en compte.

    Bref tenez moi au courant sur la facon de faire je vous met un bout de code, dites moi si ma démarche est bonne svp.

    PersistanceManager :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    public class PersistanceManagerDB implements IFPersistanceManager {
     
    	  protected java.sql.Connection con = null;
    	  protected Statement st;
    	  protected DataSource ds;
     
    	  static private boolean init;
     
    	  static protected IFPersistanceManager instance;
     
    	  // ** ** ** ** ** ** ** ** ** ** ** ** ** ** **//
    	  protected PersistanceManagerDB() throws ServletException {
    	    init();
    	  }
     
    	  static public IFPersistanceManager getInstance() throws ServletException{
    		if (instance == null) {
    		   instance = new PersistanceManagerDB();
    		}
     
    	    if (!init) {
    	      throw new RuntimeGSTException("PersistanceManagerDB non initialisee.");
    	    }
    	    return instance;
    	  }
     
            //Connexion à la db via un pool de connexion  
    		public void init() throws ServletException{
    			con = null;
     
    			try {
    				//récupération de la source de donnée
    				//Pool de connexions c3p0
    				Context initContext = new InitialContext();
    				Context envContext = (Context) initContext.lookup("java:/comp/env");
    				ds = (DataSource) envContext.lookup("jdbc/c3p0Pool");
     
    				if (envContext == null)
    	                throw new Exception("Error: No Context");
    	            if (ds == null)
    	                throw new Exception("Error: No DataSource");
     
    	            init= true;
     
    			} catch (Exception e) {
    	            e.printStackTrace();
    			}
    		}
     
      //            **********
      //	** ** ** PRODUIT ** ** ** ** ** **//
      //            **********
      public List findAllProduits() {
     
        Vector v = new Vector();
        st = null;
        ResultSet rs = null;
        String sql = "";
     
        sql = "SELECT * FROM produit;";
        try {
          //con = ds.getConnection();
          st = con.createStatement();
          rs = st.executeQuery(sql);
          while (rs.next()) {
            Produit produit = this.makeProduit(rs);
            v.add(produit);
          }
        } catch (SQLException e) {
          throw new RuntimeGSTException(e);
        }finally { 
    // ** //
        }
     
        return v;
      }
     
    //etc... toutes les autres requetes
     
    // Methodes pour ouvrir et fermer connexion et statement
     
      public void closeCon(){
    	  try {
    		st.close();
    		con.close();
    	} catch (SQLException e) {
    		e.printStackTrace();
    	}
      }
     
      public void openCon(){
    	  try {
    		  con = ds.getConnection();
    	} catch (SQLException e) {
    		e.printStackTrace();
    	}
      }
    servlet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    public class ServletGST extends HttpServlet {
     
       /**
             * 
             */
       private static final long serialVersionUID = 1L;
     
       private IFPersistanceManager pm;
     
       public void init(ServletConfig config) throws ServletException {
        super.init(config);
        pm = PersistanceManagerDB.getInstance();
       }
     
     
    //////**** doPost ****////// 	
     
       public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws IOException, ServletException {
    		String para = request.getParameter("action");
    		String vue = "";
    		HttpSession session = request.getSession();
     
    		//Ouverture de la connexion
    		pm.openCon();
     
    	//** Produit **//
     
    		//** Action -> Renvoie listeProduits.jsp **//
    		if(para.equals("listerProduits")){
    			vue = listeProduits(request,response);
    			appliquerLaVue(request,response,vue);
    		}
     
    //etc ... pour chaque action envoyer par post
     
    // A la fin fermeture de la connexion et statement
     
    		//fermeture de la connexion
    		pm.closeCon();
    }
    Alors cette aproche vous parait elle correcte ?

Discussions similaires

  1. Réponses: 6
    Dernier message: 14/01/2010, 08h33
  2. [TOMCAT] Probleme de lien entre les rapports
    Par skunkies dans le forum BIRT
    Réponses: 9
    Dernier message: 28/05/2009, 14h41
  3. Lien symbolique entre Apache et Tomcat sous Debian
    Par rohstev dans le forum Administration système
    Réponses: 17
    Dernier message: 13/05/2008, 10h33
  4. Bash - Nombre de liens physiques
    Par troumad dans le forum Linux
    Réponses: 8
    Dernier message: 08/03/2005, 11h10
  5. Diff. de taille physique entre CHAR(1) et VARCHAR2(1)
    Par foster06 dans le forum Oracle
    Réponses: 6
    Dernier message: 20/10/2004, 11h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo