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 :

Passer les paramètres de connexion à un singleton


Sujet :

JDBC Java

  1. #1
    Membre actif Avatar de kalina
    Femme Profil pro
    Développeur Java
    Inscrit en
    Avril 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2009
    Messages : 220
    Points : 293
    Points
    293
    Par défaut Passer les paramètres de connexion à un singleton
    Bonjour à tous,
    voilà, j'utilise un singleton pour la connexion à une bdd oracle et il y a plusieurs utilisateurs chacun avec son mot de passe, donc comment passer les paramètres (url,user,pass) au singleton? à noter que même l'url peut changer selon l'@ du pc où se trouve la bdd.
    merci d'avance.

  2. #2
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 791
    Points
    4 791
    Par défaut
    S'il s'agit d'une application desktop, chaque poste exécute l'application indépendamment et il n'y a qu'un singleton par poste totalement indépendant des autres ...
    Chaque utilisateur peut donc s'identifier sans perturber les autres.
    où se situe le problème ?
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  3. #3
    Membre actif Avatar de kalina
    Femme Profil pro
    Développeur Java
    Inscrit en
    Avril 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2009
    Messages : 220
    Points : 293
    Points
    293
    Par défaut
    Citation Envoyé par Népomucène Voir le message
    S'il s'agit d'une application desktop, chaque poste exécute l'application indépendamment et il n'y a qu'un singleton par poste totalement indépendant des autres ...
    Chaque utilisateur peut donc s'identifier sans perturber les autres.
    oui c'est exactement ça, actuellement j'utilise le singleton comme 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
     
    public class Connexion{
     
    	/**
             * URL de connection
             */
    	private String url = "jdbc:oracle:thin:@localhost:1521:MaBase";
    	/**
             * Nom du user
             */
    	private String user = "user1";
    	/**
             * Mot de passe du user
             */
    	private String passwd = "pass1";
    	/**
             * Objet Connection
             */
    	private static Connection connect;
     
    	/**
             * Constructeur privé
             */
    	private Connexion(){
    		try {
                        Class.forName("oracle.jdbc.driver.OracleDriver");
    		    connect = DriverManager.getConnection(url, user, passwd);
     
    		} 
                    catch(Exception e){
                    if(!(e.fillInStackTrace().equals(null))){
                    new Erreur(e.fillInStackTrace().toString()).setVisible(true);
                }
             }
     
    	}
     
    	/**
             * Méthode qui va nous retourner notre instance
             * et la créer si elle n'existe pas...
             * @return
             */
    	public static Connection getInstance(){
     
    		if(connect == null){
     
    			new Connexion();
    		}
    		return connect;	
    	}	
    }
    et je fait appel au singleton au démarrage de l'application dans ma fenêtre principale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Connection con=Connexion.getInstance();
    le premier problème c'est que "localhost" peut changer selon le pc où se trouve la bdd donc j'aimerais pouvoir configurer l'@ au démarrage, ensuite je voudrais savoir qui a fait quoi sur certaines tables donc je vais devoir ajouter une colonne id_user sur chacune de ces table,donc chaque utilisateur dois s'identifier au début.
    ça veut dire que les variable:url,user et passwd doivent être affectées de l'extérieur du singleton ,n'est-ce pas?
    voilà c'est là que je bloque.
    merci pour votre intérêt.

  4. #4
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 791
    Points
    4 791
    Par défaut
    localhost = le poste sur lequel l'application est exécutée.
    Ce qui veut dire que, tel que c'est programmé, l'application va chercher une base sur son propre poste.
    Alors qu'en fait la base est sur un serveur (ou un poste) partagé ?
    Si c'est le cas, l'url devrait avoir comme syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private String url = "jdbc:oracle:thin:@//192.xx.xx.xx:1521:MaBase";
    avec 192.xx.xx.xx qui serait l'adresse IP de la machine qui héberge la base Oracle

    user et passwd doivent être affectées de l'extérieur du singleton ,n'est-ce pas
    oui, l'utilisateur doit taper son login et mot de passe que tu récupères pour renseigner ton singleton
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  5. #5
    Membre actif Avatar de kalina
    Femme Profil pro
    Développeur Java
    Inscrit en
    Avril 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2009
    Messages : 220
    Points : 293
    Points
    293
    Par défaut
    Citation Envoyé par Népomucène Voir le message
    localhost = le poste sur lequel l'application est exécutée.
    Ce qui veut dire que, tel que c'est programmé, l'application va chercher une base sur son propre poste.
    Alors qu'en fait la base est sur un serveur (ou un poste) partagé ?
    Si c'est le cas, l'url devrait avoir comme syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private String url = "jdbc:oracle:thin:@//192.xx.xx.xx:1521:MaBase";
    avec 192.xx.xx.xx qui serait l'adresse IP de la machine qui héberge la base Oracle
    la bdd est sur un poste partagé, la dessus il n'y a pas de problème
    Citation Envoyé par Népomucène Voir le message
    oui, l'utilisateur doit taper son login et mot de passe que tu récupères pour renseigner ton singleton
    et alors comment renseigner mon singleton c'est ça le but de mon post!
    en les passant comme paramètres à getInstance()? je trouve ça tellement moche! comment régler ça sans sortir de l'idée du singleton?

  6. #6
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 791
    Points
    4 791
    Par défaut
    Il faut ajouter une méthode setLogin.
    Cela donne :
    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
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    public class Connexion {
    
        public void setLogin(String user, String passwd) {
            this.user = user;
            this.passwd = passwd;
            try {
                Class.forName("oracle.jdbc.driver.OracleDriver");
                connect = DriverManager.getConnection(url, user, passwd);
    
            } catch (Exception e) {
                if (!(e.fillInStackTrace().equals(null))) {
                    new Erreur(e.fillInStackTrace().toString()).setVisible(true);
                }
            }
        }
    
        /**
         * URL de connection
         */
        private String url = "jdbc:oracle:thin:@localhost:1521:MaBase";
        /**
         * Nom du user
         */
        private String user;
        /**
         * Mot de passe du user
         */
        private String passwd;
        /**
         * Objet Connection
         */
        private static Connection connect;
        /**
         * Constructeur privé
         */
        private Connexion() {
        }
    
        /**
         * Méthode qui va nous retourner notre instance et la créer si elle n'existe
         * pas...
         *
         * @return
         */
        public static Connection getInstance() {
    
            if (connect == null) {
    
                new Connexion();
            }
            return connect;
    
        }
    
    }
    Après, quand tu lances ton application, tu demandes à l'utilisateur son login et mot de passe AVANT d'utiliser ta classe Connexion
    du coup, pour alimenter ton singleton, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Connexion connexion = Connexion.getInstance();
    connexion.setLogin(user, passwd);
    après, comme à chaque appel de Connexion.getInstance() la variable connect n'est pas null, ça va utiliser le connect en cours et la règle du singleton est respectée.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  7. #7
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 791
    Points
    4 791
    Par défaut
    Par ailleurs, je ne sais pas comment réagit Oracle (je travaille avec d'autres bases)
    mais en général, ce n'est pas très bon de laisser une connexion ouverte en permanence.
    Habituellement on ferme la connexion après chaque exécution de requête ... mais bon, c'est un autre débat dans lequel je préfère ne pas entrer pour l'instant vu qu'il s'agit manifestement d'une application de petite taille.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  8. #8
    Membre actif Avatar de kalina
    Femme Profil pro
    Développeur Java
    Inscrit en
    Avril 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2009
    Messages : 220
    Points : 293
    Points
    293
    Par défaut
    Il me semble que vous oubliez que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Connexion.getInstance()
    ne retourne pas un objet de type Connexion(c-à-d mon singleton) mais un objet de type Connection (c-à-dire java.sql.Connection)? c'est pour ça que c'est compliqué!
    merci

  9. #9
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 791
    Points
    4 791
    Par défaut
    ah oui, je n'avais pas fait attention.
    il faut ajouter à ton singleton une méthode qui te retourne la connexion :
    (les modifs sont en vert)
    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
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    public class Connexion {
    
        public void setLogin(String user, String passwd) {
            this.user = user;
            this.passwd = passwd;
            try {
                Class.forName("oracle.jdbc.driver.OracleDriver");
                connect = DriverManager.getConnection(url, user, passwd);
    
            } catch (Exception e) {
                if (!(e.fillInStackTrace().equals(null))) {
                    new Erreur(e.fillInStackTrace().toString()).setVisible(true);
                }
            }
        }
    
        /**
         * URL de connection
         */
        private String url = "jdbc:oracle:thin:@localhost:1521:MaBase";
        /**
         * Nom du user
         */
        private String user;
        /**
         * Mot de passe du user
         */
        private String passwd;
        /**
         * Objet Connection
         */
        private static Connection connect;
        /**
         * Constructeur privé
         */
        private Connexion() {
        }
    
        /**
         * Méthode qui va nous retourner notre instance et la créer si elle n'existe
         * pas...
         *
         * @return
         */
        public static Connexion getInstance() {
    
            if (instance == null) {
    
                instance = new Connexion();
            }
            return instance ;
    
        }
    
        public Connection getConnect(){
            return connect;         
        }
    
        private static Connexion instance = null;
    
    }
    la récupération de la Connection se fera par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Connexion.getInstance().getConnect()
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  10. #10
    Membre actif Avatar de kalina
    Femme Profil pro
    Développeur Java
    Inscrit en
    Avril 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2009
    Messages : 220
    Points : 293
    Points
    293
    Par défaut
    Citation Envoyé par Népomucène Voir le message
    Par ailleurs, je ne sais pas comment réagit Oracle (je travaille avec d'autres bases)
    mais en général, ce n'est pas très bon de laisser une connexion ouverte en permanence.
    Habituellement on ferme la connexion après chaque exécution de requête ... mais bon, c'est un autre débat dans lequel je préfère ne pas entrer pour l'instant vu qu'il s'agit manifestement d'une application de petite taille.
    j'aurai aimé régler ce problème aussi, en effet l'idéale pour moi est de libérer toutes les ressources utilisées par mon application à sa fermeture, et la seule solution que j'ai trouvé mais qui ne me satisfait pas, c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try{
          con.close();   
      }
      catch(Exception e){
          .....
      }
    à la fermeture de ma fenêtre principale (là où je fait appel à mon singleton)

  11. #11
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 791
    Points
    4 791
    Par défaut
    avec singleton, ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try{
          Connexion.getInstance().getConnect().close();   
      }
      catch(Exception e){
          .....
      }
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  12. #12
    Membre actif Avatar de kalina
    Femme Profil pro
    Développeur Java
    Inscrit en
    Avril 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2009
    Messages : 220
    Points : 293
    Points
    293
    Par défaut
    bon, je vais mettre de l'ordre dans tous ça et je vous tiens au courent, merci beaucoup pour votre contribution

  13. #13
    Membre actif Avatar de kalina
    Femme Profil pro
    Développeur Java
    Inscrit en
    Avril 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2009
    Messages : 220
    Points : 293
    Points
    293
    Par défaut
    Bonjour,
    Pour ceux que ça intéresse voilà comment j'ai réglé le problème(pour l'url surtout!):
    1.pour mon singleton j'ai ajouté la méthode suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public static void setURL(String url1){
                url=url1;
            }
    2.j'appelle cette méthode au démarrage de l'application comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Connexion.setURL("jdbc:oracle:thin:@"+ip+":1521:MaBase");
            con=Connexion.getInstance();
    je pense que c'était ça votre logique "Népomucène", merci pour votre aide.

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

Discussions similaires

  1. Externaliser les paramètres de connexion à la base ?
    Par Bobsinglar dans le forum Struts 2
    Réponses: 4
    Dernier message: 30/11/2007, 11h03
  2. passer les paramètres d'un formulaire
    Par techtonyc dans le forum Général JavaScript
    Réponses: 17
    Dernier message: 24/04/2007, 13h58
  3. [D7 - ADO]Tester les paramètres de connexion
    Par portu dans le forum Bases de données
    Réponses: 3
    Dernier message: 17/04/2007, 19h29
  4. Réponses: 2
    Dernier message: 20/10/2006, 08h23
  5. Cacher les paramètres de connexion à la BD
    Par heddicmi dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 12/10/2006, 17h04

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