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 :

Java/MySQL/JDBC vs VB6/MySQL/ODBC


Sujet :

JDBC Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de kimausoleil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2004
    Messages : 126
    Par défaut Java/MySQL/JDBC vs VB6/MySQL/ODBC
    Bonjour,

    Je suis en train de passer une application VB6 se connectant à MySQL par une connexion ODBC en une application Java se connectant par le JDBC...

    J'étais donc parti bien confiant, et j'ai voulu faire un test de rapidité !

    Une simple requête SELECT sur une table qui renvoie quelques 40000 enregistrements, la base étant sur un serveur distant avec ma connexion internet pourrie de 1M.

    Stupeur :
    - par mon vieux programme VB6, 16 sec d'exécution
    - par mon beau programme JAVA, 1 minute !!!!



    Là j'ai vraiment du mal à comprendre...
    JDBC serait-il si lent ?!

    Voici comment je me suis connecté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            Statement st = null;
            ResultSet rs = null;
     
            clear();
            try {
     
                st = Kernel.getConnexion().createStatement();
                rs = st.executeQuery(requete);
     
                while ( rs.next() ) {
    J'ai donc mis des points d'arrêt sur la creation du statement, du resultset et le while : les temps "chronométrés" sont bien sur le executeQuery...


    Y-a-til quelque chose à faire ?
    Faut-il abandonner Java dès qu'on fait du MySQL ?!
    VB6 plus fort que JAVA ?!!


    Merci de vos suggestions.

  2. #2
    Membre Expert
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Par défaut
    salut.
    pour bien mener ton teste , il sera mieux de tester l'exécution avec une base de données LOCALE et essaye d'utiliser PreparedStatement à la place de Statement

  3. #3
    Membre confirmé Avatar de kimausoleil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2004
    Messages : 126
    Par défaut
    Citation Envoyé par slim_java Voir le message
    salut.
    pour bien mener ton teste , il sera mieux de tester l'exécution avec une base de données LOCALE et essaye d'utiliser PreparedStatement à la place de Statement
    En ce qui concerne le local (sur le réseau interne), il n'y a pas de problèmes !
    Très rapide, même plus rapide quavec une base access locale à mon PC...

    Après pour un PreparedStatement, il faut que j'essaie pour voir...

    merci pour ta réponse.

  4. #4
    Membre confirmé Avatar de kimausoleil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2004
    Messages : 126
    Par défaut
    Finalement, ça ne change rien...

    Néanmoins, si on passe l'application en applet, là les connexions sont très rapides ?

    Bizarre, non ?

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Il faudrait plus d'infos, peux-tu montrer la totalité de ta classe de test avec les imports ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre chevronné
    Inscrit en
    Juillet 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 534
    Par défaut
    Peux-tu nous montrer ton code complet? (connection, statement)

    Quel IDE que tu utilises pour ton test?


    Grille

  7. #7
    Membre confirmé Avatar de kimausoleil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2004
    Messages : 126
    Par défaut
    Ok... je vais essayer de vous présenter cela simplement :


    Je charge une ArrayList comme cela :

    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
     
        /**
         * Chargement de la liste selon la reqête passée en paramètre
         * @param requete
         */
        protected void load(String requete) {
     
            PreparedStatement st = null;
    //        Statement st = null;
            ResultSet rs = null;
     
            clear();
            try {
     
                long beginTime = System.currentTimeMillis();
     
                st = Kernel.getConnexion().prepareStatement(requete);
                rs = st.executeQuery();
     
    //            st = Kernel.getConnexion().createStatement();
    //            rs = st.executeQuery(requete);
     
                long endTime = System.currentTimeMillis();
                System.out.println(String.valueOf(beginTime) + " -> " +  String.valueOf(endTime) + " : " +  String.valueOf(endTime-beginTime) );
     
                Adresse adresse;
                while ( rs.next() ) {
     
                    adresse = buildAdresse(rs);
     
                //  on ajoute l'adresse à la collection !
                    add(adresse);
     
                //  on déclenche l'appel aux listeners... (pratique pour la progressbar)
                    fireListeChanged();
     
                }
     
            } catch (Exception ex) {
                System.out.println("Impossible de charger la liste des adresses : " + ex.getMessage());
            } finally {
                try {
                    if (rs != null) rs.close();
                    if (st != null) st.close();
                    rs = null;
                    st = null;
                } catch (SQLException ex) {}
            }
     
        }

    Donc vous pouvez remarquer que je me suis "amusé" à chronométrer le temps d'exécution de ma requête... preparedStatement ou pas !

    Par ailleurs voici ma classe Kernel (précédemment initialisée) me renvoyant la connexion :

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
     
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.util.Properties;
     
     
     
     
    /**
     * Classe gérant la connexion avec le serveur MySQL ou ACCESS
     * @author chris
     */
    public class Kernel {
     
     
        private Connection connexion;
     
        private String host;
        private String dataBase;
        private String user;
        private String pwd;
     
        private String fichier;
     
     
     
        /**
         * Création d'une connexion avec Mysql
         * @param host
         * @param dataBase
         * @param user
         * @param pwd
         * @throws DBConnectorException
         */
        public Kernel(String host, String dataBase, String user, String pwd) throws DBConnectorException {
     
            if ( connexion==null ) {
     
                try {
     
                    Class.forName("com.mysql.jdbc.Driver").newInstance();
                    connexion = DriverManager.getConnection("jdbc:mysql://" + host + "/" + dataBase, user, pwd);
     
                    this.host = host;
                    this.dataBase = dataBase;
                    this.user = user;
                    this.pwd = pwd;
     
                } catch (Exception ex) {
                    throw new DBConnectorException("Impossible d'établir une connexion avec MySQL !\n" + ex.getMessage());
                }
     
            }
     
        }
     
     
     
        /**
         * Création d'une connexion avec ACCESS
         * @param fichier
         * @param user
         * @param pwd
         * @throws DBConnectorException
         */
        public Kernel(String fichier) throws DBConnectorException {
     
            if ( connexion==null ) {
     
                try {
     
                    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
     
                    String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + fichier;
                    Properties props = new Properties();
                    props.put ("charSet", "ISO-8859-15");       //sinon problèmes des accents en lisant base access
     
                    connexion = DriverManager.getConnection(url, props);
     
                    this.fichier = fichier;
     
                } catch (Exception ex) {
                    throw new DBConnectorException("Impossible d'établir une connexion avec ACCESS !\n" + ex.getMessage());
                }
     
            }
     
        }
     
     
     
        /**
         * Déconnexion du serveur MySQL
         */
        public void deconnect() {
     
            try {
                if ( connexion!=null )  connexion.close();
            } catch (SQLException ex) {
                System.out.println("Erreur à la déconnexion : \n" + ex.getMessage());
            }
     
        }
     
     
     
        /**
         * Renvoie la connexion initialisée
         * @return
         */
        public static Connection getConnexion() throws DBConnectorException {
           if ( connexion==null )
                throw new DBConnectorException("Connexion à la base de données non initialisée !");
           return connexion;
        }

    Pour résumer, j'ai initialisé au lancement de mon application ma connexion à la base MySQL par le connecteur de type 4 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    kernel = new Kernel(
                            Config.getProperty(MYSQL_HOST),
                            Config.getProperty(MYSQL_DB),
                            Config.getProperty(MYSQL_USER),
                            Config.getProperty(MYSQL_PWD));
    Voilà !



    Donc j'ai refais mes tests hier soir sur une requête qui me renvoie 12000 enregistrements :

    Donc vraiment rien de plus simple... et en voilà les temps d'exécution :
    - ~6 sec par Vb6
    - ~30 sec par application Java
    - ~30 sec par applet Java (oui, en fait, dans mes précédents tests, l'applet était en connexion avec ma base access locale au lieu de mysql).


    Alors ma question est donc : pourquoi l'exécution de requêtes sur un serveur distant est plus rapide avec une application VB6 qu'avec une application Java ?


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

Discussions similaires

  1. Réponses: 23
    Dernier message: 11/04/2012, 17h00
  2. [VB6][MYSQL] recuperer des données MySQL via PHP
    Par psykotox dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 18/01/2008, 11h25
  3. Réponses: 5
    Dernier message: 22/06/2006, 12h52
  4. [Mysql][JDBC][Java]
    Par julienduprat dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 03/03/2006, 13h29
  5. [JDBC]pb com.mysql.jdbc.Driver
    Par fafaroro dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 30/12/2005, 20h42

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