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 :

Optimiser l'utilisation d'une connexion MySql


Sujet :

JDBC Java

  1. #21
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Ta classe de connexion est vraiment mal pensée... tu as défini la connexion en static !
    Si tu as 2 demandes simultanées, tu piles la première ouverte...

    Bref, les bons principes sont :
    - une classe utilitaire qui ne s'occupe QUE de renvoyer une connexion
    - des méthodes qui utilisent la connexion au travers de PreparedStatement ou Statement (ou autre...)

    La classe utilitaire pourrait ressembler à 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
     
    public class ConnectionUtils
    {
        public static Connection getConnection()
        {
            try 
            {            
                Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
                String url = "jdbc:mysql://ip:port/bd_name";
                String user = "user_name";
                String passwd = "password";
                return DriverManager.getConnection(url, user, passwd);
            } 
            catch (Exception e) 
            {
                e.printStackTrace();            
            }
            return null;
        }
    }
    Tes méthodes utilisatrices
    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
     
    ...
    Connection connection = null;
    PreparedStatement pstmt = null;
     
    try
    {
        connection = ConnectionUtils.getConnection();
        pstmt = connection.prepareStatement("....");
         ...
    }
    catch (Exception e)
    {
        // on signale
    }
    finally
    {
        if (pstmt != null) pstmt.close();
        if (connection != null) connection.close();
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  2. #22
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    Ok merci pour votre aide
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  3. #23
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 166
    Points
    4 166
    Par défaut
    Tu peux sortir le chargement du driver dans un bloc static; pas besoin de l'exécuter à chaque appel de la méthode.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    static {
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    }

  4. #24
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    Et je met ça à quel niveau?
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  5. #25
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Ta classe de connexion est vraiment mal pensée... tu as défini la connexion en static !
    Si tu as 2 demandes simultanées, tu piles la première ouverte...
    Je ne comprend pas quand vous parlez de 2 connexion simultanée vous voulez dire sur la même machine ou dans le réseau?
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  6. #26
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Un développement d'application Swing met en oeuvre des Threads, il se pourrait très bien que 2 Threads traitent des données DB simultanément et là, problème avec une connexion "static".
    Alors ce n'est peut-être pas le cas de ton application, met là, j'émets des doutes sur le respect des bonnes manières, tu auras certainement codé tes méthodes dans le thread AWT ce qui est fortement déconseillé (tu peux figer ton ihm)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #27
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 705
    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 705
    Points : 4 783
    Points
    4 783
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Tu peux sortir le chargement du driver dans un bloc static; pas besoin de l'exécuter à chaque appel de la méthode.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    static {
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    }
    Il y a un truc que je n'avais pas vu ; pour MySQL il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Class.forName("com.mysql.jdbc.Driver");
    et non pas appeler le JdbcOdbcDriver (qui ne sert que pour utiliser une base Access ...)

    donc on pourrait se dire : "pourquoi ça marche quand même ?"

    parce que le com.mysql.jdbc.Driver est, en principe, de type 4 et donc s'autocharge en service au lancement de l'application avant même son utilisation.
    Ma science est toute neuve c'est en lisant un post récent de professeur shadoko que j'ai appris que les pilotes JDBC de type 4 n'avait plus besoin de Class.forName("com.mysql.jdbc.Driver").

    Moralité : on peut supprimer le Class.forName et la classe utilitaire de OButterlin devient :
    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
     
    public class ConnectionUtils
    {
        public static Connection getConnection()
        {
            try 
            {            
                String url = "jdbc:mysql://ip:port/bd_name";
                String user = "user_name";
                String passwd = "password";
                return DriverManager.getConnection(url, user, passwd);
            } 
            catch (Exception e) 
            {
                e.printStackTrace();            
            }
            return null;
        }
    }
    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. #28
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 705
    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 705
    Points : 4 783
    Points
    4 783
    Par défaut
    Citation Envoyé par junior222 Voir le message
    Je ne comprend pas quand vous parlez de 2 connexion simultanée vous voulez dire sur la même machine ou dans le réseau?
    Sur la même machine.
    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/

  9. #29
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Un développement d'application Swing met en oeuvre des Threads, il se pourrait très bien que 2 Threads traitent des données DB simultanément et là, problème avec une connexion "static".
    Alors ce n'est peut-être pas le cas de ton application, met là, j'émets des doutes sur le respect des bonnes manières, tu auras certainement codé tes méthodes dans le thread AWT ce qui est fortement déconseillé (tu peux figer ton ihm)
    La je ne comprend pas bien où vous voulez en venir mais ce que je peux dire c'est que j'utilise le thread juste pour exécuter ma class main qui est mon interface de login
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  10. #30
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    Citation Envoyé par Népomucène Voir le message
    Il y a un truc que je n'avais pas vu ; pour MySQL il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Class.forName("com.mysql.jdbc.Driver");
    et non pas appeler le JdbcOdbcDriver (qui ne sert que pour utiliser une base Access ...)

    donc on pourrait se dire : "pourquoi ça marche quand même ?"

    parce que le com.mysql.jdbc.Driver est, en principe, de type 4 et donc s'autocharge en service au lancement de l'application avant même son utilisation.
    Ma science est toute neuve c'est en lisant un post récent de professeur shadoko que j'ai appris que les pilotes JDBC de type 4 n'avait plus besoin de Class.forName("com.mysql.jdbc.Driver").

    Moralité : on peut supprimer le Class.forName et la classe utilitaire de OButterlin devient :
    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
     
    public class ConnectionUtils
    {
        public static Connection getConnection()
        {
            try 
            {            
                String url = "jdbc:mysql://ip:port/bd_name";
                String user = "user_name";
                String passwd = "password";
                return DriverManager.getConnection(url, user, passwd);
            } 
            catch (Exception e) 
            {
                e.printStackTrace();            
            }
            return null;
        }
    }
    Merci beaucoup j'ai testé et voilà un exemple:
    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
     
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
     
     
    public class ConnectionUtils {
        public static Connection getConnection()
        {
            try 
            {            
                String url = "jdbc:mysql://ip:port/bd_name";
                String user = "user";
                String passwd = "password";
                return DriverManager.getConnection(url, user, passwd);
            } 
            catch (Exception e) 
            {
                e.printStackTrace();            
            }
            return null;
        }
        public static void main(String [] args){
        	PreparedStatement pstmt=null;
        	Connection connection=ConnectionUtils.getConnection();
        	try
        	{
        	    connection = ConnectionUtils.getConnection();
        	    pstmt = connection.prepareStatement("select * from client");    	
        	    System.out.println("exécuté");
        	    ResultSet res=pstmt.executeQuery();
        	    while(res.next())
        	    	System.out.println(res.getInt(1));
        	}
        	catch (Exception e)
        	{
        		e.printStackTrace();
        	}
        	finally
        	{
        	    if (pstmt != null)
    				try {
    					pstmt.close();
    				} catch (SQLException e) {
    					e.printStackTrace();
    				}
        	    if (connection != null)
    				try {
    					connection.close();
    				} catch (SQLException e) {
    					e.printStackTrace();
    				}
        	}
        }
    }
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  11. #31
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Points : 1 493
    Points
    1 493
    Par défaut
    Bonjour,
    Tu te donnes de la peine à fermer la ressource occupée par PreparedStatement pour rien. Utilise try with ressources disponible depuis Java 7 pour te simplifier la tâche.
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

  12. #32
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    Citation Envoyé par MasterMbg Voir le message
    Bonjour,
    Tu te donnes de la peine à fermer la ressource occupée par PreparedStatement pour rien. Utilise try with ressources disponible depuis Java 7 pour te simplifier la tâche.
    Vous avez un exemple svp?
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  13. #33
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Points : 1 493
    Points
    1 493
    Par défaut
    Bah, un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    try(PreparedStatement pstmt = connection.prepareStatement( "select * from client" )){
    //Suite de ton code....
    }
    catch (Exception e){
    e.printStackTrace();
    }
    Dans ce cas, tu te passes du bloc finally, qui lui aussi aurait besoin d'un bloc try/catch... Le code devient plus lisible et tu développes un peu plus rapidement.
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

  14. #34
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 705
    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 705
    Points : 4 783
    Points
    4 783
    Par défaut
    Citation Envoyé par MasterMbg Voir le message
    Bonjour,
    Tu te donnes de la peine à fermer la ressource occupée par PreparedStatement pour rien. Utilise try with ressources disponible depuis Java 7 pour te simplifier la tâche.
    D'après la doc Oracle, ça ne marcherait qu'avec des drivers JDBC 4.1.
    Est-on sûr que MySql a un driver de ce type ?
    Quand je vois la doc du JDBC MySql, j'ai un doute... Mais j'ai peut-être mal cherché ?
    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/

  15. #35
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    Citation Envoyé par MasterMbg Voir le message
    Bah, un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    try(PreparedStatement pstmt = connection.prepareStatement( "select * from client" )){
    //Suite de ton code....
    }
    catch (Exception e){
    e.printStackTrace();
    }
    Dans ce cas, tu te passes du bloc finally, qui lui aussi aurait besoin d'un bloc try/catch... Le code devient plus lisible et tu développes un peu plus rapidement.
    Ok et pour l'objet de connexion?
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  16. #36
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Points : 1 493
    Points
    1 493
    Par défaut
    Citation Envoyé par Népomucène Voir le message
    D'après la doc Oracle, ça ne marcherait qu'avec des drivers JDBC 4.1.
    Est-on sûr que MySql a un driver de ce type ?
    Quand je vois la doc du JDBC MySql, j'ai un doute... Mais j'ai peut-être mal cherché ?
    Les drivers de MySQL depuis la version 3 sont tous de type 4.
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

Discussions similaires

  1. tester une connexion mysql
    Par pop_up dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 03/08/2007, 16h08
  2. API à utiliser pour une connexion wi-fi
    Par ilhamita dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 23/02/2007, 11h04
  3. Realiser une connexion mysql et execute une requete
    Par Taz_8626 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/05/2006, 11h52
  4. [JSP] erreur lors d'une connexion à mySQL
    Par Jovial dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 31/08/2004, 17h48
  5. Utilisation d'une base MySQL
    Par sylviefrfr dans le forum Bases de données
    Réponses: 5
    Dernier message: 29/06/2004, 16h30

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