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

JDBC Java Discussion :

Singleton / DBCP, comment configurer ?


Sujet :

JDBC Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Par défaut Singleton / DBCP, comment configurer ?
    Bonjour,
    Je me lance dans le développement d'application java depuis peu. J'étais sous PHP avant, et pour me connecter à ma base de donnée, j'utilisais un singleton. Vu le fonctionnement des singletons en Java, j'ai pensé que cela pouvait poser problème.
    J'ai trouvé sur ce même forum quelque chose qui évoquait DBCP que je trouvais plutôt pas mal dans le principe. Dans la pratique, j'ai quelques problèmes pour la mise en oeuvre. Je pensais avoir configuré correctement Tomcat, mais apparement, ce n'est pas le cas
    Sur une page JSP, j'ai mis ce code (et l'import qui va bien) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <%
    out.println(DataBase.getConnection());
    %>
    avec ma classe DataBase :
    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
    package utils;
     
    import java.sql.Connection;
    import java.sql.SQLException;
     
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.sql.DataSource;
     
    public class DataBase {
    	public static Connection getConnection(){
    		Context ctx = null;
    		try {
    			ctx = new InitialContext();
    		} catch (NamingException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		try {
    			return ((DataSource)ctx.lookup("java:comp/env/jdbc/Ysandra")).getConnection();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (NamingException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return null;
    	}
    }
    Malheureusement quand je vais sur ma page de test, j'obtiens un joli "null".

    J'ai mis la configuration de ma base de donnée dans META-INF/context.xml :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <Context>
    	<Resource name="jdbc/Ysandra" auth="Container" type="javax.sql.DataSource" />
    	<ResourceParams name="jdbc/Ysandra">
    		<parameter>
    			<name>username</name>
    			<value>root</value>
    		</parameter>
    		<parameter>
    			<name>password</name>
    			<value>lalala</value>
    		</parameter>
    		<parameter>
    			<name>url</name>
    			<value>jdbc:mysql://localhost:3306/ysandra_www?autoReconnext=true</value>
    		</parameter>
    		<parameter>
    			<name>driverClassName</name>
    			<value>org.gjt.mm.mysql.Driver</value>
    		</parameter>
    		<parameter>
    			<name>factory</name>
    			<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
    		</parameter>
    		<parameter>
    			<name>maxActive</name>
    			<value>20</value>
    		</parameter>
    		<parameter>
    			<name>maxIdle</name>
    			<value>3</value>
    		</parameter>
    		<parameter>
    			<name>maxWait</name>
    			<value>5000</value>
    		</parameter>
    	</ResourceParams>
    </Context>
    Et dans WEB-INF/web.xml j'ai ajouté ceci dans <web-app> :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      <resource-ref>
      	<description>Connexion MySQL</description>
      	<res-ref-name>jdbc/Ysandra</res-ref-name>
      	<res-type>javax.sql.DataSource</res-type>
      	<res-auth>Container</res-auth>
      </resource-ref>
    Est-ce que j'aurais mal compris une étape de la configuration ? Est-ce que l'idée de la classe avec une méthode statique est mauvaise et pourquoi ?

    Pour info, mon java -version (Mac OS X 10.5.6):
    java version "1.6.0_07"
    Java(TM) SE Runtime Environment (build 1.6.0_07-b06-153)
    Java HotSpot(TM) 64-Bit Server VM (build 1.6.0_07-b06-57, mixed mode)

    Je suis sous la dernière version de Tomcat 6.

    Merci d'avance

  2. #2
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2006
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 503
    Par défaut
    Hello,

    A mon humble avis, une classe Database écrite de cette manière, c'est l'horreur .... tout simplement.

    Cela fait plus de 10 ans maintenant que je travaille avec du JDBC (Oracle, mySQL ou autres) dont j'ai soit écrit du code moi-même, soit repris du code!

    Les heures que j'ai passé pour identifier que le serveur SQL n'était pas lancé, que j'étais sur la mauvaise machine, que ma table avait changé de format, etc, etc, ... et tout cela parce que le traitement des erreurs était mal fait!

    Le singleton, pas de problème, pour obtenir l'instance. Mais pas de connexion dans un constructeur, s...v...p!

    Toujours se mettre dans la tête: comment le programmeur, l'utilisateur ou l'administrateur du système va identifier rapidement la faute.

    Qu'est-ce qu'un e.printStackTrace() va apporter à un utilisateur "normal"?
    Par contre il n'est pas interdit d'enregistrer correctement ces informations quelque part (traçage ou log) pour aider le programmeur à corriger la faute.

    Dans le cas d'une transaction SQL avec JDBC, il y a en fait relativement peu de cas d'erreur qui peuvent être programmé dans une jolie classe Database et bien écrite classe!

    Tiens ... je pourrais une fois écrire un article ici sur ce sujet!?!

    Cordialement

  3. #3
    Membre expérimenté Avatar de sewatech
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Par défaut
    Complètement d'accord avec boijea pour la gestion des erreurs... J'insisterais encore en disant que des bloc try / catch sont mal fichus.

    Ta datasource est configurée comme pour Tomcat 5.0. Jette un oeil à la doc de Tomcat 6, pour le format du fichier de contexte.

  4. #4
    Membre habitué
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Par défaut
    Le singleton, pas de problème, pour obtenir l'instance. Mais pas de connexion dans un constructeur, s...v...p!
    Sans vouloir remettre en question tes connaissances, je pense ne pas avoir utilisé un singleton au sens propre du terme, et je ne pense pas avoir ouvert la connexion dans le constructeur puisqu'il n'y en a pas (de constructeur)

    Qu'est-ce qu'un e.printStackTrace() va apporter à un utilisateur "normal"?
    Je testais simplement

    Complètement d'accord avec boijea pour la gestion des erreurs... J'insisterais encore en disant que des bloc try / catch sont mal fichus.
    J'ai surtout en tête le modèle objet php, avec une sous utilisation du try/catch. Tu n'aurais pas un article sous le coude pouvant me conseiller de ce côté là ? Ou juste me faire voir de quelle manière j'aurais pu écrire mon code

    Sinon, c'était bien dû au format du context.xml, merci. (c'est rigolo, le grand message apporte quasiment rien sur le problème, alors que le petit m'a donné direct la réponse :3)

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Il faudrait peut-être sortir ton lookup de ta méthode getConnection, ou tout du moins ne l'exécuter que si besoin, car cela fait partie de traitement coûteux qu'il n'est pas nécessaire d'effectuer à chaque récupération de connexion.

  6. #6
    Membre expérimenté Avatar de sewatech
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Par défaut
    Tu ne dois pas faire 2 try car si tu as une exception dans le premier, il faut interrompre la méthode. Il ne faut surtout pas essayer de lookup, puisque ctx sera null.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Context ctx = null;
    try {
    	ctx = new InitialContext();
    	return ((DataSource)ctx.lookup("java:comp/env/jdbc/Ysandra")).getConnection();
    } catch (SQLException e) {
    	// ...
    } catch (NamingException e) {
    	// ...
    }
    return null;

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/10/2005, 09h26
  2. [Tomcat]Comment configurer Tomcat pour faire du javascript ?
    Par uliss dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 10/02/2005, 17h29
  3. Comment configurer bochs s.v.p.....?
    Par hudson dans le forum Assembleur
    Réponses: 1
    Dernier message: 24/11/2004, 22h46
  4. [Win2000] comment configurer le démarage?
    Par vasilov dans le forum Windows Serveur
    Réponses: 3
    Dernier message: 08/11/2004, 20h08
  5. [Jboss][ mysql] : Comment configurer ?
    Par PeteMitchell dans le forum Wildfly/JBoss
    Réponses: 3
    Dernier message: 02/03/2004, 14h21

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