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

Accès aux données Discussion :

[VB2005][MySQL] Probleme de lenteur


Sujet :

Accès aux données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 79
    Points : 83
    Points
    83
    Par défaut [VB2005][MySQL] Probleme de lenteur
    Plate-forme : VS2005 pro
    SGBD : Mysql
    langage : VB2005


    Bonjour à tous,

    je developpe un logiciel de gestion de cabinet connecté à une bdd mysql à distance.

    dans mon exemple, j'ai une fenetre utilisateur avec un formulaire (pour creer, modifier un compte utilisateur) et dans ce formulaire j'y ai mis un bouton permettant de choisir un utilisateur dans une liste.
    Sur le click du bouton, j'ouvre donc une nouvelle fenêtre avec un listview :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    code dans la fenetre utilisateur
     
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            ListUti.ShowDialog()
    End Sub
    Au chargement de cette fenetre listuti, je charge tout les utilisateurs :

    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
     
    Imports System
    Imports MySql.Data.MySqlClient
    Imports MySql.Data.VisualStudio
     
    Public Class ListUti
        Dim Cnx As MySqlConnection = New Connexion().SeConnecter
     
      ' Chargement a l'ouverture de cette fenêtre la liste complète des utilisateurs
        Private Sub ListUti_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            chargementListe()
        End Sub
     
        Private Sub chargementListe()
            Cnx = New Connexion().SeConnecter
            Try
                ListView1.Items.Clear()
                Dim SQLFind As String = "select * from utilisateur"
                Dim command As MySqlCommand = New MySqlCommand(SQLFind, Cnx)
                Dim reader As MySqlDataReader = command.ExecuteReader()
                While reader.Read()
                    Dim cellule1 As Int32 = reader.GetInt32(0)
                    Dim cellule2 As String = reader.GetString(3)
                    Dim cellule3 As String = reader.GetString(4)
                    Dim LVI As New ListViewItem
                    LVI.Text = cellule1
                    LVI.SubItems.Add(cellule2)
                    LVI.SubItems.Add(cellule3)
                    ListView1.Items.Add(LVI)
                End While
     
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
            Cnx.Close()
        End Sub
     
    end class
    J'ai délais de chargement trop trop long à l'ouverture de cette fenetre.

    Ensuite une fois que cette fenetre est chargé c'est impeccable sur la connexion. quand je ferme la fenetre de la liste et que je la réouvre cela marche niquel !

    je suis à votre ecoute, merci d'avance.

    Johan PROTIN

  2. #2
    Membre régulier Avatar de DonkeyMaster
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 95
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par xG-Hannibal
    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
    Imports System
    Imports MySql.Data.MySqlClient
    Imports MySql.Data.VisualStudio
    
    Public Class ListUti
        Dim Cnx As MySqlConnection = New Connexion().SeConnecter
    
    ...
    
        Private Sub chargementListe()
            Cnx = New Connexion().SeConnecter
            Try
                ListView1.Items.Clear()
                Dim SQLFind As String = "select * from utilisateur"
                Dim command As MySqlCommand = New MySqlCommand(SQLFind, Cnx)
                Dim reader As MySqlDataReader = command.ExecuteReader()
                While reader.Read()
                    Dim cellule1 As Int32 = reader.GetInt32(0)
                    Dim cellule2 As String = reader.GetString(3)
                    Dim cellule3 As String = reader.GetString(4)
                    Dim LVI As New ListViewItem
                    LVI.Text = cellule1
                    LVI.SubItems.Add(cellule2)
                    LVI.SubItems.Add(cellule3)
                    ListView1.Items.Add(LVI)
                End While
    
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
            Cnx.Close()
        End Sub
    end class
    Ce que je fais lorsque j'ai des problèmes de performance, c'est que j'essaie de voir dans quelle portion de code ça se situe.

    Pour cela, il y a la classe StopWatch. J'avais vu ça dans un tuto, et depuis je m'en sers tout le temps. Tu peux obtenir tes résultasts, soit en écrivant dans un ficheir texte (plus propre), soit en affichant un MessageBox (plus rapide, mais beaucoup plus pénible), soit une autre solution de ton cru.

    Bref.

    J'ai vu que tu crées la connection 2 fois. Peut-être que tu as un goulot de performance au niveau de la création de la connection, alors le fait de la créer 2 fois ne dois pas vraiment aider. Débarrasse-toi de celle qui figure dans la déclaration du champ.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Cnx As MySqlConnection = Nothing
    Ensuite, dans ta boucle, tu crées sans cesse de nouveaux objets. C'est facilement optimisable. Soit tu déclares tes variables avant la boucle, soit tu les utilises même pas. Pour la clarté du code, je dirais que la première solution est meilleure dans la plupart des cas, mais ici je préfère la deuxième.
    (Ceci dit, pour un si petit nombre d'objets, je ne suis même pas sûr que le gain soit si grande que ça)

    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
                ListView1.Items.Clear()
                Dim SQLFind As String = "select * from utilisateur"
                Dim command As MySqlCommand = New MySqlCommand(SQLFind, Cnx)
                Dim reader As MySqlDataReader = command.ExecuteReader()
                Dim cellule1 As Int32
                 Dim cellule2 As String
                 Dim cellule3 As String
                 Dim LVI As ListViewItem
                While reader.Read()
                    cellule1 = reader.GetInt32(0)
                    cellule2 = reader.GetString(3)
                    cellule3 = reader.GetString(4)
                    LVI = New ListViewItem
                    LVI.Text = cellule1
                    LVI.SubItems.Add(cellule2)
                    LVI.SubItems.Add(cellule3)
                    ListView1.Items.Add(LVI)
                End While
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
                 ListView1.Items.Clear()
                Dim SQLFind As String = "select * from utilisateur"
                Dim command As MySqlCommand = New MySqlCommand(SQLFind, Cnx)
                Dim reader As MySqlDataReader = command.ExecuteReader()
                Dim LVI As ListViewItem
                While reader.Read()
                    LVI = New ListViewItem
                    LVI.Text = reader.GetInt32(0)
                    LVI.SubItems.Add(reader.GetString(3))
                    LVI.SubItems.Add(reader.GetString(4))
                    ListView1.Items.Add(LVI)
                End While
    Peut-être qu'avec les résultats du test de performance tu arriveras à mieux cerner le problème.

    Par exemple, si le problème c'est effectivement l'établissement de la connexion, je te conseillerais de créer une connexion une fois lors du lancement de l'appli, récupérer toutes les infos dont tu penses avoir besoin, puis fermer la connexion. Ou alors, utiliser toujours la même connexion, que tu garderas dans un module, et la laisser ouverte tout le temps. Ce qui n'est pas sympa pour le serveur, mais bon.

    Et encore une chose : compare les performances en mode Debug contre les performances en mode Release. On a parfois des surprises comme ça.

    PS: attention en reprenant mon code, je ne l'ai pas testé et je ne suis pas un natif du VB

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 79
    Points : 83
    Points
    83
    Par défaut
    merci de ta réponse,

    comme tu as vu je déclare ma connexion en début de ma classe.

    normalement je n'ai pas à redéclarer mon cnx avant de lancer une requête, mais quand je ne redéclare pas, j'ai un message d'erreure qui me dit que ma connexion n'est pas ouverte ou qu'elle n'existe pas.

    Ensuite j'ai bidouillé en redéclarant mes cnx dans chaque sub et j'y ajoute juste avant un cnx.close(), par miracle ca marche nikel et les connexion sont instantannées sur ma bdd mysql.

    je ne comprends pas pourquoi mais ca marche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Class ListUti
        Dim Cnx As MySqlConnection = New Connexion().SeConnecter
     
    ...
     
        Private Sub chargementListe()
            Cnx.close()
            Cnx = New Connexion().SeConnecter
            Try
                ListView1.Items.Clear()
                Dim SQLFind As String = "select * from utilisateur"
                Dim command As MySqlCommand = New MySqlCommand(SQLFind, Cnx)
                Dim reader As MySqlDataR

  4. #4
    Membre régulier Avatar de DonkeyMaster
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 95
    Points : 110
    Points
    110
    Par défaut
    Ta connexion, elle n'est pas fermée pour de vrai.
    Pour comprendre ce que je veux dire, il te faut chercher ce que c'est que le pooling de connexions.

    Mais en gros, on sait qu'établir une connexion, ça coûte cher, alors au lancement de l'application, on crée des connexions, et quand tu fais Close(), pour dire que tu n'en as plus besoin, la connexion n'est pas fermée pour de vrai. Elle est juste mise de côté. Quand tu as à nouveau besoin d'une connexion, l'application te donne la même. "Tiens, prends celle-là. Elle est déjà prête mais personne ne s'en sert, alors tu peux l'utiliser".
    En fait, c'est vachement optimisé.

    Pour les petites applis comme ça, c'est pratique, mais pour les serveurs web, qui doivent gérer beaucoup de connexions de très courte durée, c'est un boost considérable pour les performances.



    Et quand tu as un problème de performances, tu devrais vraiment penser à utiliser StopWatch pour pionter ce problème avec précision.


    n'oublie pas :

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

Discussions similaires

  1. [MySQL] Probleme de connexion
    Par sylvain_neus dans le forum Hibernate
    Réponses: 19
    Dernier message: 01/08/2007, 09h34
  2. [VB2005][MySQL] Probleme de connexion BDD
    Par xG-Hannibal dans le forum Accès aux données
    Réponses: 8
    Dernier message: 14/01/2007, 22h12
  3. [debutante][JDBC/MySQL] probleme de pilote
    Par nounou dans le forum JDBC
    Réponses: 3
    Dernier message: 27/04/2004, 14h26
  4. [MYSQL] Probleme lors de la compilation
    Par Nasky dans le forum Autres éditeurs
    Réponses: 10
    Dernier message: 24/02/2004, 17h04
  5. [Sybase]probleme de lenteur
    Par MASSAKA dans le forum Sybase
    Réponses: 3
    Dernier message: 19/03/2003, 22h58

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