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 :

[Struts][Pool SGBD Tomcat]LookUp Datasource


Sujet :

Tomcat et TomEE Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de ultracoxy
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 116
    Par défaut [Struts][Pool SGBD Tomcat]LookUp Datasource
    Développeurs, Développeuses, bonjour !

    Je suis actuellement stagiaire.

    J'utilise Struts, Tomcat et MySQL dans mon appli et je veux mettre en place un pool de connexion par Tomcat.

    J'ai bien suivi les tutos en ce qui concerne les fichiers nécessaires et les paramétrages dans les fichiers xml.

    Seulement, je ne sais pas où récupérer ma datasource sachant que j'ai plusieurs servlets. Dois-je réaliser, une unique fois, ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     Context initCtx = new InitialContext();
     Context envCtx = (Context)initCtx.lookup("java:comp/env");
     Datasource ds = (Datasource)envCtx.lookup("jdbc/MaDatasource");
     Connection conn;
     if(ds instanceof ConnectionPoolDataSource){
        ConnectionPooledDatasource poolDS = (ConnectionPoolDataSource)ds;
        PooledConnection pc = poolDS.getPooledConnection();
        conn = pc.getConnection();
     }else{
        conn = ds.getConnection();
    Ou bien dois je mettre ce bout de code dans chaque servlet ?

    Si je dois l'exécuter une seule fois, j'ai penser à utiliser un singleton.

    Pourriez vous éclairer mes esprits ? Je cherche à faire le plus propre et générique possible, afin de respecter le pattern MVC de Struts.

    Merci d'avance !

  2. #2
    Membre confirmé Avatar de ultracoxy
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 116
    Par défaut
    Re bonjour,

    Ne me dites pas qu'aucun de vous ne s'est jamais servi des datasources ? Comment avez vous écrits vos programmes ? Me conseillez vous d'utiliser le pattern de DAO ? Comment et où récupérez vous votre datasource jndi ?

    Help !

  3. #3
    Membre chevronné

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2002
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 346
    Par défaut
    L'utilisation du pattern DAO est en effet une bonne iddée. La séparation des couches étant la base de toute bonne programmation J2EE.

    Sinon, je te conseil d'externaliser la création de ta connection dans une classe helper (qui peut être un singleton). Derrrière celà, il y a aussi la question de quand ouvrire ou fermer les connexion (donc faut-il le faire dans toutes les servelt). Les avis sont partagé :
    - connection persistante : commune à toutes les servelt, ouverte en début d'application, fermée en fin
    - connection courte : ouverte avant chaque utilisation, fermé aprés chaque.
    - connection de la durrée de la request : stockée dans une variable ThreadLocale, elle est ouverte en début de requête HTTP et fermé en fin de requête (par exemple dans la servelt de strust ou le request processor de tiles) - parfois compliqué à mettre en place.

    Mon avis est qu'en contexte web, il faut mieux ne pas laisser de connexion ouverte trop longtemps, donc une solution avec des connexion courte ou des connexions de la durrée de la request sont à privilégié.

    Tu peut aussi jetter un coup d'oeil du coté des commons-dbutils de jakarta qui donne des outils pour manipuler facilement les connexions.

  4. #4
    Membre confirmé Avatar de ultracoxy
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 116
    Par défaut
    Merci des infos. J'ai vu un post qui propose de faire une classe de type Singleton sur cette page http://www.developpez.net/forums/arc.../t-100999.html
    Mais je ne comprends pas bien ce que cela implique. La connexion est ouverte en permanence dans ce cas ou non ? Si la datasource a été récupérée par une servlet, une autre servlet peut elle en récupérer une autre instance en même temps ?

    Pour ma part, vu que j'aurai pas mal de requêtes à traiter, je souhaiterais mettre en place des connexions courtes par une méthode pas trop trop compliquée dans un premier temps. Vu que je débute en Struts, je m'embrouille sur l'oganisation MVC. Comment puis-je utiliser des connexions courtes ? Je dois rechercher le context JNDI et le datasource à chaque fois que je veux me connecter à ma BDD ? Est ce que je peux utiliser la méthode décrite dans le post dans j'ai mis l'url plus haut ?

    Thanks

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 746
    Par défaut
    Salut,


    J'utilise aussi les pool de connexion Tomcat vers une db mysql.

    Ce que j'ai fait c'est que pour chaque table de ma base, j'ai une classe "nomDeLaTableDAO" dans laquelle j'ai des méthodes basiques du style "ajouterObjet()", "obtenirListeSelonCode(int code)" etc...

    et c'est donc dans le constructeur de cette classe je récupère la connexion via le lookup, puis dans chaque méthode je récupère la connexion, je l'ouvre et je la ferme dans le finally().

    Au final, dans mes actions struts, lorsque j'ai besoin d'aller en bdd je fais ca :

    ArrayList laListe = new tableDAO().getAllObjets();

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 746
    Par défaut
    voici du code pour être plus clair :

    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
     
     
    public class AdminDAO {
        private DataSource ds;
        Connection con=null;
        Statement s=null;
        ResultSet rs=null;
     
        /** Creates a new instance of AdminDAO */
        public AdminDAO() {
            //récupération de la source de donnée
            try{
                Context initCtx = new InitialContext();
                ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/connGesam");            
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
     
    /**
         * Retourne l'AdminBean correspondant au login passé en param ou null si le login est erronné.
         *
         */
        public synchronized AdminBean getAdmin(String login) {
     
            try {
                //récupération de la Connection depuis le DataSource
                con = ds.getConnection();
                rs=null;
                s = con.createStatement();
                rs = s.executeQuery("SELECT * FROM admins where login LIKE '"+login+"'");
     
                if (rs!=null && rs.next()){                
                    return (new AdminBean(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4),rs.getString(5)));
                } else
                    return null;
     
            } catch (Exception ex) {
                ex.printStackTrace();
                return null;
            }finally {
                if (rs != null) {
                    try {
                        rs.close();
                    } catch (SQLException e) {}
                    rs = null;
                }
                if (s != null) {
                    try {
                        s.close();
                    } catch (SQLException e) {}
                    s = null;
                }
                if (con != null) {
                    try {
                        con.close();
                    } catch (SQLException e) {}
                    con = null;
                }
            }
        }
    Tu remarquera que j'ai mis les méthodes en synchronized.
    Au début je me suis dit tiens comme ca au moins il n'y aura pas d'accès concurrent, mais je pense que c'est faux car effectivement il ne peux pas y avoir d'accès concurent sur la même instance de ma classe AdminDAO, par contre si je crée simultanément plusieurs AdminDAO, je peux appeller ces méthodes simultanément...

    dites le moi si je me trompe

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DataDource][Struts][Tomcat] Pb DataSource
    Par hepsilonz dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 17/01/2007, 22h24
  2. [struts] probleme de tomcat?
    Par pouss dans le forum Tomcat et TomEE
    Réponses: 9
    Dernier message: 04/05/2006, 14h36
  3. [pool connexion tomcat]
    Par agougeon dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 16/01/2006, 15h18
  4. [ Tomcat ]débuguer application Struts sans pluggin Tomcat
    Par laurent.c123 dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 12/07/2005, 14h32
  5. [Eclipse + Tomcat + Struts] lancement de Tomcat
    Par phoebe dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 24/05/2005, 10h17

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