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

Bases de données Discussion :

Plantage d'un serveur


Sujet :

Bases de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut
    Bonjour,

    Depuis quelques temps je développe une application client/serveur et j'ai remarqué des plantages aléatoires de mon serveur sur les trois fonctions qui lisent ou écrivent dans ma base de donnée. La fréquence des plantages varie beaucoup. Il peut arriver que ça plante deux fois de suite ou alors au bout d'une centaine de passage sur ces fonctions. .
    Peut être que cela ne vient pas des bases de données mais je pense malgré tout, vu que le code de mes fonctions est plutôt banal et que je ne suis pas en multithreading.
    Sinon j'utilise WAMP avec MySql.

    Les paramètres du QSqlTableModel sont par défaut. Et voilà, je ne sais que dire d'autre. .
    Je poste ci-dessous la fonction qui cause le plus de plantage :

    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
    void Serveur::traitePacket2()
    {
     
    /// /////////////////////////////////////////////////////////////////
                   /// Packet de connection de persos ///
    /// /////////////////////////////////////////////////////////////////
     
    //sf::Lock Lock(mutex);
     
    sf::Packet packetAenvoyer;
    recognized = false; // On précise au serveur que le joueur n'a pas encore été reconnu.
     
     
    information->append("Test de reconnaissance du joueur dans la bdd.");
     
    /// Re-sélection des données de la table
    model->setTable("joueur");
    model->select();
     
    /// //// Test de reconnaissance du cochon dans la bdd //// ///
        for(int i = 0; i < model->rowCount(); i++)
        {
        QSqlRecord record;
        record = model->record(i); /// Lecture de la ligne i.
     
    /// Comparaison des noms ///
        information->append(QString::fromStdString(joueurTest.nomJoueur));
        information->append(record.value(1).toString());
        information->append(QString::fromStdString(mdp));
        information->append(record.value(2).toString());
    /// ////////////////////////
     
     
     
           if((joueurTest.nomJoueur == record.value(1).toString().toStdString()) && (mdp == record.value(2).toString().toStdString()))
           {
            nbBDD = i;
            recognized = true;
           }
     
     
        }
    /// //////////////////////////////////////////////////////////
     
     
     
    information->append("Recherche du client dans le serveur à qui renvoyer une réponse, positive ou négative.");
     
    /// ////// Recherche du client qui a envoyé la requête ////// ///
            for (int b = 0; b < nbJoueurs; b++)
            {
     
            information->append(QString::fromStdString(client[b].adresseClient.ToString()));
            information->append(QString::fromStdString(joueurTest.adresse));
     
                if(joueurTest.adresse == client[b].adresseClient.ToString())
                {
                nbClient = b;
                foundAdresse = true; // On l'a reconnu, on termine la boucle.
                }
     
            }
    /// /////////////////////////////////////////////////////////////
     
     
     
    if (recognized == true) /// Si le cochon a été reconnu dans la BDD
    {
     
    QSqlRecord recordBis;
    recordBis = model->record(nbBDD); /// Lecture de la ligne nbBDD, correspondante au joueur reconnu.
     
     
     
        if(recordBis.value(3).toString().toStdString() == "Connect") /// Si le joueur en question est déjà entrain de jouer.
        {
     
        information->append("Un client a essayé d'utiliser un compte déjà connecté !");
     
        packetAenvoyer << 7 << true << false << joueurTest.vie << joueurTest.nomJoueur << joueurTest.position.x << joueurTest.position.y
        << joueurTest.nbFrameCurrent  << joueurTest.angle << joueurTest.nbVictoire << joueurTest.nbDefaite << joueurTest.numPartie;
     
     
        client[nbClient].socketClient.Send(packetAenvoyer);
     
        }
     
     
        else /// Sinon, si le joueur n'est pas entrain de jouer.
        {
     
     
        packetAenvoyer << 2 << true << false << joueurTest.vie << joueurTest.nomJoueur << joueurTest.position.x << joueurTest.position.y
        << joueurTest.nbFrameCurrent  << joueurTest.angle << joueurTest.nbVictoire << joueurTest.nbDefaite << joueurTest.numPartie;
     
     
     
            if (foundAdresse == false)
            {
            information->append("Un client s'est déconnecté en pleine tentative de connection =/");
            }
            else /// Sinon, si on l'a trouvé, on lui envoie le packet pour lui annoncer q'il est connecté ! ///
            {
     
            information->append("Un joueur s'est connecté !");
     
            model->setTable("joueur");
            model->select();
            model->setData(model->index(nbR2, 3), QString::fromStdString("Connect")); // On met le joueur dans son état "playing".
            model->submitAll();
     
            oss.str("");
            oss << nbBDD;
            information->append(QString::fromStdString(oss.str()));
     
     
     
            /// Initialisation du nom du client.
            client[nbClient].nomClient = joueurTest.nomJoueur;
            client[nbClient].isChoosing = true; // Le client se retrouve devant le tableau de partie.
     
            client[nbClient].socketClient.Send(packetAenvoyer); // Connection du Joueur.
     
            }
     
     
     
        }
     
     
    foundAdresse = false; // On reinitialise la variable pour le prochain tour de boucle.
     
     
    }
     
     
     
     
     
    else
    { /// Si le joueur n'a pas été reconnue
     
     
    packetAenvoyer << 2 << false << false << joueurTest.vie << joueurTest.nomJoueur << joueurTest.position.x << joueurTest.position.y
    << joueurTest.nbFrameCurrent << joueurTest.angle << joueurTest.nbVictoire << joueurTest.nbDefaite << joueurTest.numPartie; // On annonce la non-connection du joueur.
     
     
     
     
        if (foundAdresse == false)
        {
        information->append("Un client s'est déconnecté en pleine tentative de connection =/");
        }
        else // Sinon, si on l'a trouvé, on lui envoie le packet pour lui annoncer ces mauvaises frappes.
        {
     
        client[nbClient].socketClient.Send(packetAenvoyer);
     
        }
     
    foundAdresse = false; // On reinitialise la variable pour le prochain tour de boucle.
     
    }
     
    } /// /// Fin de la fonction du traitement du packet de connection /// ///
    Peut être cela vient-il de ma manière d'utiliser les fonctions qui gèrent la base de donnée ?
    Je peux donner quelques autres bizarreries si cela peut aider à mettre sur la voie :
    Mon serveur se déconnecte de la bdd s'il reste trop longtemps ouvert.
    Les lignes se rajoutent un peu n'importe comment dans la bdd, sans ordre précis, alors que je précise bien de rajouter une ligne à model->rowCount(). . .

    Je suis également ouïe à d'autres causes potentielles de plantage d'une application de manière aléatoire car je suis vraiment dépité ^^

    Je remercie ceux qui ont eu la patience de lire mon post et plus encore ceux qui pourront m'apporter ne serait-ce qu'un morceau de réponse =)

    Merci d'avance

    Malgré ces bugs très imprévisibles je continue à coder et j'ai pu m'apercevoir d'une chose qui je l'espère fera naître quelques idées sur l'origine du problème. .
    En fait, parfois le passage dans ces fonctions se fait une centaine de fois sans que ça plante, et tout d'un coup, ça va se mettre à planter trois ou quatre fois de suite. Et puis quelques minutes plus tard, plus rien.
    Du coup j'aurais aimé savoir s'il était probable que le problème vienne de WAMP avec MySql et non de mon code ?

    Sinon je me demandais également si le fait que j'initialise des floats ou des doubles à 0 et non 0.f ou 0.0 pourrait poser problème ?

    Merci d'avance

    Je continue à proposer au cas où ^^
    J'ai entendu parler du stack overflow. . . me semble-t-il =)
    Et donc j'ai pensé au fait que je créais mes objets mais sans les détruire en fin de fonction. . . A part qu'ils se détruisent tout seul entièrement ?
    Donc voilà j'aurais aimé savoir si ça peut faire potentiellement planté mon application car elle prend trop de mémoire par exemple ?
    Même si elle ne semble pas faire laguer mon pc. . .


    Merci d'avance =)

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut
    Pour vérifier que ton application ne prend pas trop de mémoire, utilise le gestionnaire de tâches Windows (ou une application équivalent sous les autres OS) : taskmgr.exe. Il t'affiche, dans l'onglet Processes, dans la colonne Memory, la quantité de mémoire que le processus occupe. Ça ne devrait pas dépasser les 100 Mo (en comptant extrêmement large, avec GUI et tout le bataclan). Si, par contre, tu vois que la taille augmente sans cesse... alors il y a bien un problème à la destruction de tes objets. Si ça monte puis que ça redescend, tu vois bien le moment où tes objets sont créés et où ils sont détruits.

    Un objet, avec Qt, est automatiquement détruit dès qu'il sort du scope, c'est-à-dire dès que tu sors de la fonction où il a été défini (si tu as une boucle et que tu appelles une fonction dedans, et que tu instancies un objet à chaque appel del af onction, chaque fois que tu en sortiras, cet objet sera détruit).
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

Discussions similaires

  1. Problème d'acces à mon portail après plantage de mon serveur
    Par chantalboyer dans le forum Configuration
    Réponses: 0
    Dernier message: 28/12/2010, 19h08
  2. Plantage d'un serveur > migration des données
    Par cedtic dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 15/10/2007, 16h00
  3. Réponses: 5
    Dernier message: 07/09/2006, 15h09
  4. Réponses: 1
    Dernier message: 21/06/2006, 14h10

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