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 :

Connexion très lente à un serveur MySQL


Sujet :

JDBC Java

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 36
    Points : 24
    Points
    24
    Par défaut Connexion très lente à un serveur MySQL
    Bonjour à tous,

    je développe actuellement une application permettant de gérer l'utilisation des ordinateurs d'un lycée. Les applications clientes sont sur des postes Linux et le serveur MySQL est sur un Windows XP pro (oui je sais ça peut paraitre bizarre, mais c'était comme ça quand je suis arrivé).

    J'ai d'abord repris l'ébauche de programme repris développé par un étudiant, mais je me suis aperçu qu'il était vraiment mal fichu (et comme mes souvenirs de java remontaient à vieux, c'était plus intéressant de tout refaire pour réapprendre les mécanismes).

    Mais les deux programmes avaient le même souci, ils étaient lents, très lents à tel point que les fenêtres plantaient.

    En parsemant le code d'alert consoles, je me suis aperçu que la cause de cette lenteur c'était la connexion au serveur MySQL.
    En fait pour chaque requête, j'ouvrais la connexion et la fermais après le résultat.

    Pour pallier à ce problème, je charge le driver et me connecte à la base au lancement du programme. Les requêtes se faisant par la suite et je ne fermes donc plus la connexion.
    Mais est-ce que le garbage collector ne risque pas de fermer ma connexion à un moment ou à un autre alors qu'elle devrait rester active tout le long de l'existence du programme ? Si oui, comment l'en empêcher ?

    Il faut savoir, que si un utilisateur utilise le programme, il y aura au moins une requête de mise à jour toutes les minutes, mais il se peut aussi, qu'aucun utilisateur n'utilise le programme pendant plusieurs heures.

    Merci de votre aide.

  2. #2
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Première chose qui ne corrigera rien à la lenteur, mais règlera déja les problèmes au niveau du platage du GUI: fais tes requêtes dans des Threads et modifies ton interface à la fin des thres en utilisant du SwingUtilities.invokeLater(Runnable r) histoire de respecter l'Event Dispatch Thread.

    ça t'éviteras les différents plantages au niveau graphique.

    Ensuite pour mysql, là je ne saurais me prononcer sans infos supplémentaires.

    Fais nous voire exactement comment tu code les blocs où tu fais tes requêtes
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 36
    Points : 24
    Points
    24
    Par défaut
    Pour les threads c'est une bonne idée mais je ne suis pas encore à l'aise avec. J'ai découvert les threads en m'intéressant au timer dans ce programme.
    Je pense que je vais m'y attarder un peu dessus.

    Pour le code pas de problème, je l'upload tout de suite.
    Fichiers attachés Fichiers attachés

  4. #4
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Pourtant il est nécessaire dans ton cas de les utiliser.
    Ton actionPerformed effectue des requêtes et ce ce fait ce bloc doit être exécuté en tant que thread.

    Voici grosso modo ce que ça donnerait pour toi au niveau de la classe client

    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
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
     
    public class Client extends JFrame implements ActionListener {
        private JLabel labelUser;
        private JLabel labelPassword;
        private JLabel labelEtat;
        private JLabel labelAvertissement;
        private JTextField inputUser;
        private JPasswordField inputPassword;
        private JButton boutonConnexion = new JButton("Connexion");
        private JButton boutonQuitter = new JButton("Quitter");
        public User utilisateur;
        private int longueurEcran;
        private int largeurEcran;
        private boolean chronoOrNo = false;
     
        //constructeur
        public Client(User _utilisateur) {
            utilisateur = _utilisateur;
     
            JPanel panel = new JPanel();
            panel.setLayout(new GridLayout(4, 2, 5, 5));
            labelUser = new JLabel("Login : ");
            labelPassword = new JLabel("Password : ");
            inputUser = new JTextField(10);
            inputPassword = new JPasswordField(10);
            labelEtat = new JLabel("Déconnecté...");
            labelAvertissement = new JLabel("");
     
            //ajout des ecouteurs d'evenements aux elements de l'interface
            boutonConnexion.addActionListener(this);
            boutonQuitter.addActionListener(this);
     
            //creation des objets composant l'interface graphique du programme
            boutonQuitter.setEnabled(false);
            panel.add(labelUser);
            panel.add(labelPassword);
            panel.add(inputUser);
            panel.add(inputPassword);
            panel.add(boutonConnexion);
            panel.add(boutonQuitter);
            panel.add(labelEtat);
            panel.add(labelAvertissement);
     
            //disposition, taille (tout l'écran) et affichage de l'interface
            this.setTitle("Connexion");
     
            Dimension ecranTaille = Toolkit.getDefaultToolkit().getScreenSize();
            Double longueurDouble = ecranTaille.getWidth();
            Double largeurDouble = ecranTaille.getHeight();
            longueurEcran = longueurDouble.intValue();
            largeurEcran = largeurDouble.intValue();
            System.out.println("Longueur : " + longueurEcran + ". Largeur : " +
                largeurEcran);
            setBounds(0, 0, longueurEcran, largeurEcran);
            //setBounds(0,0,250,250);
            setUndecorated(true);
            this.getContentPane().add(panel);
            this.setVisible(true);
            this.setAlwaysOnTop(true);
            this.enableEvents(AWTEvent.WINDOW_EVENT_MASK);
        }
     
        //utilisateur essaye de masquer la fenêtre
        public void processWindowEvent(WindowEvent e) {
            if (e.getID() == WindowEvent.WINDOW_CLOSING) {
                labelAvertissement.setText("Fermeture interdite");
            }
        }
     
        public boolean getChrono() {
            return chronoOrNo;
        }
     
        public void setTextAvertissement(String phraseAvertissement) {
            this.labelAvertissement.setText(phraseAvertissement);
        }
     
        public void setBoutonQuitter(boolean testQuitter) {
            boutonQuitter.setEnabled(testQuitter);
        }
     
        public void setBoutonConnexion(boolean testConnexion) {
            boutonConnexion.setEnabled(testConnexion);
        }
     
        //gestion des interactions utilisateur/programme
        public void actionPerformed(ActionEvent e) {
           MyThread t = new MyThread();
           t.start();
        }
     
        //methode permettant de deconnecter
        public void deconnexion() {
            System.out.println("Entrer dans fonction deconnexion");
            this.chronoOrNo = false;
            ConnexionSQL.setRequete(
                "update utilisateur set logged = 0 where iduser='" +
                utilisateur.getIdUser() + "'", "");
            ConnexionSQL.executerRequete();
            utilisateur.setLogin(null);
            utilisateur.setConnecte(false);
            utilisateur.setIdSession(0);
            SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        boutonQuitter.setEnabled(false);
                        boutonConnexion.setEnabled(true);
                        labelEtat.setText("Déconnecté...");
                        setBounds(0, 0, longueurEcran, largeurEcran);
                        setBounds(0, 0, 250, 250);
     
                        //this.setAlwaysOnTop(true);
                    }
                });
        }
     
        //methode principale obligatoire lancé au demarrage du prog
        public static void main(String[] arg) {
            User utilisateur = new User();
            Client fenetre = new Client(utilisateur);
            fenetre.setResizable(false);
            ConnexionSQL.connexionBD(fenetre, utilisateur);
        }
     
        private class MyThread extends Thread {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                super.run();
                SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            labelAvertissement.setText("");
                        }
                    });
     
                System.out.println("lancement de la fonction getConnecte()");
     
                //utilisateur lance la procedure de connexion
                if (utilisateur.getConnecte() == false) {
                    utilisateur.setIdUser(0);
                    utilisateur.setIdSession(0);
                    System.out.println(
                        "utilisateur pas connecte, lance identification");
     
                    //l'utilisateur n'a pas rempli tous les champs du formulaire d'identification
                    if (inputUser.getText().equals("") ||
                            String.valueOf(inputPassword.getPassword()).equals("")) {
                        SwingUtilities.invokeLater(new Runnable() {
                                public void run() {
                                    labelAvertissement.setText(
                                        "Vous devez saisir votre mot de passe et votre login !");
                                }
                            });
                    } else {
                        ConnexionSQL.setRequete(
                            "select pass from utilisateur where login='" +
                            Client.this.inputUser.getText() + "'", "pass");
     
                        //identification reussie
                        if (String.valueOf(inputPassword.getPassword())
                                      .equals(ConnexionSQL.executerRequete())) {
                            //enregistre l'id de l'utilisateur pour faciliter les futures operations
                            ConnexionSQL.setRequete(
                                "select iduser from utilisateur where login='" +
                                Client.this.inputUser.getText() + "'", "iduser");
     
                            String recupIdUser = ConnexionSQL.executerRequete();
                            utilisateur.setIdUser(Integer.parseInt(recupIdUser));
     
                            //premiere connexion de la journee
                            if (utilisateur.isFirstConnexionDay() == true) {
                                utilisateur.insertNewSession();
                                System.out.println(
                                    "Premiere connexion de la journee");
                            } else {
                                //verifie le temps dont dispose l'utilisateur
                                if (utilisateur.getTempsRestant() <= 0) {
                                    SwingUtilities.invokeLater(new Runnable() {
                                            public void run() {
                                                labelAvertissement.setText(
                                                    "Votre crédit temps est épuisé.");
                                            }
                                        });
     
                                    utilisateur.setIdUser(0);
                                    utilisateur.setIdSession(0);
                                    utilisateur.setLogin(null);
                                    utilisateur.setConnecte(false);
                                    System.out.println("Credit temps epuise");
                                }
     
                                System.out.println(
                                    "Pas premiere connexion de la journee");
     
                                //reste du temps, continuer le processus
                            }
     
                            if (utilisateur.getIdUser() != 0) {
                                if (utilisateur.getTempsRestant() > 0) {
                                    System.out.println("Connexion utilisateur");
                                    utilisateur.setLogin(Client.this.inputUser.getText());
                                    utilisateur.setConnecte(true);
                                    ConnexionSQL.setRequete(
                                        "update utilisateur set logged = 1 where login='" +
                                        utilisateur.getLogin() + "'", "");
                                    ConnexionSQL.executerRequete();
     
                                    SwingUtilities.invokeLater(new Runnable() {
                                            public void run() {
                                                labelEtat.setText("Connecté...");
                                                setBounds(0, 0, 250, 250);
                                                boutonQuitter.setEnabled(true);
                                                boutonConnexion.setEnabled(false);
                                                inputPassword.setText("");
                                                Client.this.setAlwaysOnTop(false);
                                            }
                                        });
     
                                    if (!utilisateur.getLogin()
                                                        .equals("administrateur")) {
                                        RepetAction.lancementChrono(Client.this,
                                            utilisateur);
                                        Client.this.chronoOrNo = true;
                                    }
                                }
                            }
                        }
                        //identification rate
                        else {
                            SwingUtilities.invokeLater(new Runnable() {
                                    public void run() {
                                        labelAvertissement.setText(
                                            "Soit le couple login/mot de passe n'existe pas, soit une session existe déjà.");
                                    }
                                });
                        }
                    }
                }
                //utilisateur lance la procedure de deconnexion
                else {
                    Client.this.deconnexion();
                }
            }
        }
    }
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

Discussions similaires

  1. [MySQL] Connexion impossible sur le serveur MySQL
    Par laurentSc dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 01/01/2015, 23h11
  2. Réponses: 0
    Dernier message: 28/10/2009, 07h00
  3. Connexion depuis Unix sur serveur Mysql sous Windows
    Par krlou dans le forum Installation
    Réponses: 4
    Dernier message: 01/02/2008, 17h32
  4. [MySQL] Connexion distante vers un serveur MySQL
    Par Shiryu57 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 05/09/2007, 11h08
  5. [Tomcat 5.5] Pool de connexion très lent
    Par JFDelges dans le forum Tomcat et TomEE
    Réponses: 9
    Dernier message: 14/10/2005, 13h44

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