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

QxOrm Discussion :

Thread et Database connection: Problème de RAM


Sujet :

QxOrm

  1. #1
    Candidat au Club
    Inscrit en
    Août 2012
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Thread et Database connection: Problème de RAM
    Bonjour, je viens de tester cette bibliothèque, qui est vraiment très simple d'utilisation pour une petite base de données perso sous linux debian. Du beau travail et notamment au point de vue de la documentation.

    Mais il semblerait qu'il ait encore une chose que je ne comprend pas

    J'ai une classe DBInterface possédant une fonction statique qui initialise la base de données.
    Cette fonction est appelé par le thread principal.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void QDABInterface::initDB() {
        qx::QxSqlDatabase::getSingleton()->setDriverName("QSQLITE");
        qx::QxSqlDatabase::getSingleton()->setDatabaseName("db/blablabla.sqlite");
        qx::QxSqlDatabase::getSingleton()->setHostName("localhost");
        qx::QxSqlDatabase::getSingleton()->setUserName("root");
        qx::QxSqlDatabase::getSingleton()->setPassword("");
    }
    Et dans la sortie log, je peux lire:
    [QxOrm] qx::QxSqlDatabase : create new database connection in thread '0x7f6698d02800' with key '{e8cb1e1f-60fa-457d-b328-429ee9b3c3e8}'

    Dans cette classe j'ai une autre fonction saveBlabla.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    void QDABInterface::saveBlaBla() {
        //BlaBla_ptr est un smart point
        // Il est effacé de la RAM correctement
        blabla_ptr bla; bla.reset(new blabla()); 
        qx::dao::insert(bla);
    }
    Cette fonction va être appelée par un thread secondaire. Et lorsque je lance le thread je peux lire dans la sortie log
    [QxOrm] qx::QxSqlDatabase : create new database connection in thread '0x7f667a846700' with key '{2a81cdad-552c-4b4e-8af2-b01e14cdf857}'.

    Si ce lance ce thread une deuxieme fois.
    [QxOrm] qx::QxSqlDatabase : create new database connection in thread '0x7f753a92d800' with key '{a8570e88-789d-41db-9653-8bb7e42222dc}'

    Et ces connections s'ajoutent donc puisque si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    qx::QxSqlDatabase::getDatabase().connectionNames()
    j'obtiens la liste des connections citées ci-dessus. Et j'obtient des résidus dans ma RAM!! Ce qui a le don de m'agacer fortement.


    J'aimerais vraiment connaitre la marche à suivre pour pouvoir utiliser les fonctions de qx::dao dans une autre Thread. Merci d'avance et bon dimanche

    Amicalement.

    Sizain

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut


    Du beau travail et notamment au point de vue de la documentation.
    Merci !

    J'aimerais vraiment connaitre la marche à suivre pour pouvoir utiliser les fonctions de qx::dao dans une autre Thread.
    Chaque fois que tu vas créer un nouveau thread, QxOrm créé automatiquement une nouvelle connexion : 1 connexion par thread, c'est comme ça que fonctionne la classe Qt QSqlDatabase.

    Ce que je te conseille : si ton application est multi-thread, alors conserve tes threads (n'en créé pas un nouveau systématiquement).
    Sinon tu peux gérer aussi ton propre pool de connexions à la base de données : chaque fonction qx::dao contient un paramètre optionnel QSqlDatabase * : par défaut à NULL (signifie 1 connexion par thread gérée automatiquement par la bibliothèque), mais tu peux renseigner ce paramètre si tu veux toi-même gérer tes connexions à la base de données : https://www.qxorm.com/qxorm_fr/manual.html#manual_310.
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  3. #3
    Candidat au Club
    Inscrit en
    Août 2012
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Salut et merci pour ta réponse rapide.

    Je commence a mieux comprendre les connexions avec QSqlDatabase.

    Malheureusement, je ne peux pas garder mon thread. Je souhaite le lancer et puis l'oublier à tout jamais, une fois la tâche effectuée.

    J'ai donc la configuration suivante:

    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
     
    // Un constructeur qui utilise la base de données et ouvre une connexion
    QDABInterface::QDABInterface(QObject *parent)
        : QObject(parent) {
        db = qx::QxSqlDatabase::getDatabase();
        db.open();
    }
     
    // Un destructeur qui ferme la base connexion
    QDABInterface::~QDABInterface() {
        db.close();
        qDebug() << db.connectionNames();
     
        // removeDatabase ne fonctionne pas je recois l'erreur qui semble classique
        // QSqlDatabasePrivate::removeDatabase: connection '{3a6c4e2e-881d-473c-8619-8611f819b018}' 
        // is still in use, all queries will cease to work.
        //QSqlDatabase::removeDatabase(db.connectionName);
    }
     
    // Et la fameuse fonction saveBlaBla utilisée dans mon thread
    void QDABInterface::saveBlaBla(int i) {
        //BlaBla_ptr est un smart point
        // Il est effacé de la RAM correctement
        blabla_ptr bla; bla.reset(new blabla()); 
        bla->m_name = QString("Name%1").arg(i);
        qx::dao::insert(bla, &db);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // fonction run de mon thread
    void run() {
    QDABInterface dbi;
    for(int i = 0; i <10; i++) {
        dbi.saveBlaBla(i);
    }
    }
    Mais pourquoi diantre, lorsque je ferme la connexions, elle reste toujours dans la liste des connexions. Ce qui signifie que à chaque fois que je lance mon thread
    ma RAM augmente de 0,3 Mo. Moi je ne veux pas... je veux une propreté de RAM parfaite! Et je voudrais vraiment et surtout que mon QDABInterface lors de la destruction
    gère également cette destruction de mémoire.
    J'ai naturellement essayé d'utiliser la fonction statique QSqlDatabase::removeDatabase(db.connectionName) dans le destructeur, mais apparement je suis tombé dans un
    piège de débutant, ce que je suis avec QSqlDatabase! Un fameux

    QSqlDatabasePrivate::removeDatabase: connection '{3a6c4e2e-881d-473c-8619-8611f819b018}' is still in use, all queries will cease to work.
    Donc en fait, ce qu'il me faudrait, c'est une instance qui crée une connexion et qui lorsqu'elle est détruite, sa connexion est également détruite.

    J'avoue ma question, c'est plutôt du Qt et QSqlDatabase que du QxOrM, mais les deux semblent faire la paire

    Si tu as une astuce pour faire cela proprement, je suis vraiment preneur.

    En tout cas merci pour ta réponse.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    Tu trouveras la réponse ici : https://stackoverflow.com/questions/...emove-database

    Ton destructeur doit ressembler à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // Un destructeur qui ferme la base connexion
    QDABInterface::~QDABInterface() {
        QString connection;
        connection = db.connectionName();
        db.close();
        db = QSqlDatabase();
        db.removeDatabase(connection);
    }
    Autre remarque : quand tu écris qx::dao::insert(bla, &db);, tu n'as pas à renseigner le dernier paramètre puisque visiblement tu utilises la connexion par défaut. Donc tu peux écrire tout simplement :
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  5. #5
    Candidat au Club
    Inscrit en
    Août 2012
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Un grand merci, maintenant c'est du propre! J'avoue que je ne comprends pas comment j'ai pu passer a travers ce thread de stack overflow!

    Bonne continuation avec QxOrM

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    Un grand merci, maintenant c'est du propre!


    Pour info : si tu as des soucis en utilisation multi-thread avec QxOrm, tu peux télécharger cette version BETA : https://www.qxorm.com/version/QxOrm_1.4.5_BETA_03.zip
    J'ai corrigé un bug remonté par un client sur le chargement des relations en environnement multi-thread.

    Voici le change log de cette version par rapport à la version 1.4.4 :
    - Fix an issue in qx::IxSqlQueryBuilder class when QxOrm library is used in a multi-thread environment
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  7. #7
    Candidat au Club
    Inscrit en
    Août 2012
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Alors ca cela m'interesse énormement, je vais tester ca ce soir peut-être si je trouve le temps.

    J'ai en fait fait deux choses pour résoudre mon problème de RAM.
    1) Effacer la connexion
    2) Faire tourner la requete SQL et donc la fonction query dans le thread principal. Sinon j'avais un problème de pile qui ne se déchargait pas. Je ne sais pas trop pourquoi pour l'instant. Mais cette solution pour l'instant me suffit amplement.

    Donc je vais compiler ca, et je te tiens au courant.

    Amicalement

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

Discussions similaires

  1. Problème d'ajout d'une Database Connection
    Par siro1 dans le forum Pentaho
    Réponses: 1
    Dernier message: 28/11/2012, 11h40
  2. Oracle database standby : problème de connection
    Par tartine dans le forum Connexions aux bases de données
    Réponses: 4
    Dernier message: 24/07/2007, 17h54
  3. Problème de RAM
    Par Bouguennec dans le forum Composants
    Réponses: 5
    Dernier message: 20/01/2006, 16h21
  4. [postnuke] Problem in Database Connection
    Par shirya dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 02/11/2005, 18h35
  5. [SERVER 2003] Problème de ram
    Par sheura dans le forum Windows Serveur
    Réponses: 9
    Dernier message: 22/08/2004, 19h36

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