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

Servlets/JSP Java Discussion :

Connexion à une BDD à l'aide de JNDI et try with resources


Sujet :

Servlets/JSP Java

  1. #1
    Membre régulier
    Homme Profil pro
    IT in outer space
    Inscrit en
    Novembre 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : IT in outer space

    Informations forums :
    Inscription : Novembre 2006
    Messages : 88
    Points : 96
    Points
    96
    Par défaut Connexion à une BDD à l'aide de JNDI et try with resources
    Bonjour,
    je suis en train d'apprendre à me connecter à une base de données à l'aide d'un bouquin. On y présente plusieurs méthodes dont certaines marchent mais on préconise l'usage de JNDI.
    J'ai recopié le code et adapté un peu à mon environnement. En gros c'est pareil sauf la chaine de connexion (il y a un cj en plus dans le nom de la classe à charger et le nom de la DB est différent) et la requête SQL effectuée.

    Ce qui se passe c'est que je n'ai aucun retour d'erreur et aucune réaction. J'ai beau mettre des sorties sur la page ou la console, rien ne se passe ce qui suggère que l'on ne rentre pas dans le try with ressources qui initie l'objet Connection.
    Je ne comprends pas pourquoi.
    Je ne sais pas si mon code de traitement est plus ou moins correct mais ce qui me préoccupe dans un premier temps c'est bien cette connexion. Pourquoi rien ne se passe ? Le même Context.xml à été utilisé un peu plus tôt en fournissant un message à l'écran qui affiche connexion ouverte et qui renvoi le nom de la classe comme demandé. Donc pas d'erreur au niveau du Context.xml à priori. C'est configuré comme il faut.

    J'ai aussi essayé de déboguer en lançant en mode débugger mais ça ne s'arrête pas à mes points d'arrêt. Comment on débogue une application Java EE ?

    Je copie mon code du doGet() ici:

    Code Java : 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
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            PrintWriter out = response.getWriter();
            String str = "Served at: "+request.getContextPath()+"\n";
            out.append(str);
            System.out.println(str);
     
            response.setContentType("text/plain");
     
            try {
                Context context = new InitialContext();
                String jndiName = "jdbc/pool_bookcollection" ;
                DataSource dataSource = (DataSource)context.lookup("java:com/env/"+jndiName);
     
                try (Connection cnx = dataSource.getConnection()){
                    System.out.println("DB USED: "+cnx.getCatalog());
                    System.out.println("Connexion "+(cnx.isClosed()?"fermée":"ouverte"));
                    out.println("Data Source: "+dataSource.getClass().getName());
     
                    // Traitement de requête pour plus tard
                } 
            } catch (SQLException|NamingException e) {
                e.getMessage();
            }

    Voilà une copie d'écran de la console après avoir rafraîchi la page. Je n'y comprend plus rien. La "truc" d'affiche mais la ligne avec "DATASOURCE: " ne s'affiche pas... alors qu'ils sont dans le même bloc de code...
    Si je déplace la dite ligne juste au dessus de
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    DataSource dataSource = (DataSource)context.lookup("java:com/env/"+jndiName);
    alors elle s'affiche.


    Nom : Annotation 2019-08-14 194402.jpg
Affichages : 540
Taille : 178,0 Ko

    Voilà le contenu du Context.xml:
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?xml version="1.0" encoding="UTF-8"?> 
    <Context> 
      <Resource  
              name="jdbc/pool_bookcollection"  
              auth="Container"  
              type="javax.sql.DataSource" 
              maxTotal="100"  
              maxIdle="30"  
              maxWaitMillis="10000" 
              username="user"  
              password="************"  
              driverClassName="com.mysql.cj.jdbc.Driver" 
              url="jdbc:mysql://localhost/bookcollection"/>  
    </Context>

    Le serveur est TomCat v9.0

    Merci.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    S'il y a une exception dans ton try-with-resource, tu ne risques pas de la voir avec :

    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    catch (SQLException|NamingException e) {
                e.getMessage();
            }

    Il faut au moins :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    catch (SQLException|NamingException e) {
                System.err.println(e.getMessage());
            }

    Ou mieux :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    catch (SQLException|NamingException e) {
                e.printStackTrace();
            }


    Ou plus complètement, spécifiquement pour une SQLException :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    System.err.println("SQLState: " + e.getSQLState());
    System.err.println("SQL Error Code: " +e.getErrorCode());
    e.printStackTrace();


    Ou mieux encore en utilisant un logger (genre Log4J par exemple)
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre régulier
    Homme Profil pro
    IT in outer space
    Inscrit en
    Novembre 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : IT in outer space

    Informations forums :
    Inscription : Novembre 2006
    Messages : 88
    Points : 96
    Points
    96
    Par défaut
    Merci.
    je vais implémenter ça et voir ce que ça dit.

    EDIT:

    Ah oui c'est sur que là on comprends mieux...
    Donc si je comprends bien il n'utilise peut-être pas le fichier context.xml qui est placé dans le META-INF.
    du coup lequel utilises t-il ?
    Bon ben je vais faire comme prévu hier et lire ceci.

    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
     
    Served at: /Playground
     
     
    truc
    javax.naming.NameNotFoundException: Le Nom [com/env/jdbc/pool_bookcollection] n'est pas lié à ce Contexte
    	at org.apache.naming.NamingContext.lookup(NamingContext.java:817)
    	at org.apache.naming.NamingContext.lookup(NamingContext.java:173)
    	at org.apache.naming.SelectorContext.lookup(SelectorContext.java:163)
    	at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:409)
    	at com.nekogaisha.bookcollection.servlets.TestConnectionServlet.doGet(TestConnectionServlet.java:49)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
    	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853)
    	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587)
    	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    	at java.base/java.lang.Thread.run(Thread.java:834)

  4. #4
    Membre régulier
    Homme Profil pro
    IT in outer space
    Inscrit en
    Novembre 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : IT in outer space

    Informations forums :
    Inscription : Novembre 2006
    Messages : 88
    Points : 96
    Points
    96
    Par défaut
    OK C'est résolu.

    Nom : Annotation 2019-08-15 155100.jpg
Affichages : 469
Taille : 171,2 Ko

    Pendant un moment j'avais suivi les instructions sur la doc de Tomcat sans résultat.
    Dans mon code il y avait des erreurs au niveau du nom de la ressource com à la place de comp notamment.
    L'ancienne méthode n'utilisait pas JNDI du tout donc ça marchait tout simplement.
    Est-ce qu'il est possible d'écrire le code de connexion à un seul endroit ?
    Le tout sans avoir à écrire dans chaque portion de code qui nécessite une connexion un bloque try et tout le toutim.
    Un peu comme je faisais avec PHP.
    Je m'en souviens vaguement mais 20 ans en arrière j'avais un dossier incl dans ma racine dans lequel il y avait un code PHP qui fait le nécessaire pour se connecter à la DB.
    Il suffisait de faire un include dans les pages où il y avait besoin et d'utiliser la connexion.

    Les pool c'est bien mais est-ce qu'on peut optimiser ça encore un peu plus ?

    J'imagine que mon bouquin m'en dira plus plus tard.

    Je marque ce sujet comme résolu.

    Nom : Annotation 2019-08-15 160418.jpg
Affichages : 506
Taille : 366,4 Ko

    Merci de m'avoir aidé à débloquer cette situation.

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

Discussions similaires

  1. [D2005] Connexion à une BDD Access
    Par landry005 dans le forum Bases de données
    Réponses: 6
    Dernier message: 24/02/2006, 11h05
  2. Réponses: 5
    Dernier message: 03/02/2006, 13h47
  3. connexion à une bdd mysql en asp
    Par asetti dans le forum ASP
    Réponses: 3
    Dernier message: 31/10/2005, 18h31
  4. [Applet][MySQL] connexion à une BDD
    Par Michel38 dans le forum JDBC
    Réponses: 19
    Dernier message: 20/07/2005, 14h59
  5. Erreur de connexion à une BDD SQL Server 2000 avec BDE
    Par SchpatziBreizh dans le forum Bases de données
    Réponses: 3
    Dernier message: 17/06/2005, 11h22

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