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 Delphi Discussion :

delphi XE avec Firebird 2.5 et multithread


Sujet :

Bases de données Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Par défaut delphi XE avec Firebird 2.5 et multithread
    Bonsoir à tous,

    J'aimerais bien que vous m'orienter un peu parce que là j'ai perdu la route

    Bien j'explique le problème :

    J'ai installé Firebird 2.5 et je cherche une méthode afin de lancer des mise à jour en parallèle d'une même table (des INSERT ou bien update). est-ce que c'est possible de gérer ça avec les thread ?

    Notez aussi que l'update et la mise à jour et l'ajout d'enregistrement concerne une même table.

    Merci d'avance pour vos conseils.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 102
    Par défaut
    Si tu veille à avoir autant d'objet Connection et Query que de thread, cela ne pose pas de problème !

    Je l'ai fait avec du BDE et IB6, il y a presque 10 ans, cela fonctionnait très bien, un collègue avait tenté d'utiliser IBX mais il avait des problèmes, je pense qu'il avait partagé ses DB Components dans ses threads !

    Ensuite, cela dépend aussi de la library, DBX, UIB, Zeos ... et comme tu n'as pas précisé le provider utilisé, on ne peut pas répondre à la question avec exactitude !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Par défaut
    Salut ShaiLe,

    je m'explique mieux là :

    les composants que j'utilise pour connexion sont : FIBPLUS 7 voire DBEXPRESS

    En ce qui concerne les objets de connexion, vous voulez dire que je dois les créer dynamiquement lors de la création du thread c'est ça ! si son l'objectif c'est q'un thread secondaire qui controle l'arrivé d'un fichier texte qui a la même structure sous plusieurs dossiers exemple le fichier se nomme DATA.01 : c'est un fichier texte qui arrive sous une arborescence comme suit :
    Dossier principal : Interface \
    - dossier 1
    - dossier 2
    - dossier 3 (jusqu'au dossier n)

    et que je veux récupérer tous les fichiers dans la base au même temps avec plusieurs threads avec des query (insert into même table article par exemple).

    J'utilise la technologie datasnap là pour construire une automate serveur qui fait le boulo mais mon souci là est ce que c'est possible de gérer les deadlock inter-thread, par exemple si j'ai 30 fichiers qui arrive je vais donc lancer 30 threads de mise à jour de la même table est-ce que c'est possible de la faire.

    Dietrying.

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 102
    Par défaut
    Citation Envoyé par dietrying Voir le message
    En ce qui concerne les objets de connexion, vous voulez dire que je dois les créer dynamiquement lors de la création du thread c'est ça !
    Cela me semble plus prudent, rien que pour la propriété DataSets d'un TSQLConnection, si tu as deux threads qui ajoutent un DataSet à un même objet, en lisant le code du TSQLConnection héritant du TCustomConnection cela ne gère pas verrou sur sa TList stockant les TDataSet\TCustomSQLDataSet, l'ajout pourrait encore passer mais la suppression serait risque de VA !

    Citation Envoyé par dietrying Voir le message
    si son l'objectif c'est q'un thread secondaire qui controle l'arrivé d'un fichier texte
    Tu utilises pour cela je suppose FindFirstChangeNotification en FILE_NOTIFY_CHANGE_FILE_NAME\FILE_NOTIFY_CHANGE_SIZE, surveillant un ensemble de répertoire, le tout dans un thread et un WaitForMultipleObjects

    Tu peux juste au moment opportun, créer la connexion, créer la query, lancer le insert, libérer query et connexion !
    Après tout, FB est conçu pour être attaqué par de multiple client, pas de différence entre un processus ou un thread pour lui !

    Citation Envoyé par dietrying Voir le message
    gérer les deadlock inter-thread, par exemple si j'ai 30 fichiers qui arrive je vais donc lancer 30 threads de mise à jour de la même table est-ce que c'est possible de la faire.
    On ne gère pas les Dead Lock ! On les évites !
    Tu voulais dire comment on synchronise des threads, avec des sémaphores, des signaux, des TThreadList ...
    Rien n'empêche d'avoir un thread dédié à effectuer des actions simples et prédéfinies sur la DB,
    Ce thread scrute une TThreadList en FIFO (couplé à un TEvent pour le réveil ou un sleep régulier), les 30 threads ajoutent dans la ThreadList une notification (cela peut être la requête, mais tu peux monter un système de notification générique), après l'ajout, il pulse le TEvent pour réveiller le thread qui va donc lire la liste, un seule thread donc une seule connexion

    A toi de voir ce qui nécessite de la parallélisation ou du séquencement !
    FireBird supportera d'avoir 30 clients qui font chacun un INSERT, c'est le but d'un SGBD tout même, l'accès concurrentiel c'est un basique !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Par défaut
    oui tout a fait j'utilise FindFirstChangeNotification en FILE_NOTIFY_CHANGE_FILE_NAME\FILE_NOTIFY_CHANGE_SIZE, pour surveiller un répertoire racine et tous les sous-rep dans un thread et un WaitForMultipleObjects.

    Pour le TThreadList : j'ai pas bien compris le principe est-ce possible de me donner un petit exemple avec un Tevent ?


    Pour l'accès concurrentiel, j'essaye de créer pour chaque répertoire (chaque thread) son propre utilisateur et tester.

    Sinon je suis en train de regarder le principe de transactions dans Firebird.

    Je te remerci bien ShaiLe pour vos conseils, je viens de basculer le language de developpement de C# vers DELPHI XE recemment (seulement 6 mois) et je travaille sur ce projet depuis. Travailler avec me parait très amusant. Et pour l'architecture DATASNAP (c'est du lourd) mais j'avance com mem.

    J'essaye de poster le code comme ça vous pourrez avoir une idée et m'enrichir avec votre expérience.

    a++

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 102
    Par défaut
    Citation Envoyé par dietrying Voir le message
    Pour le TThreadList : j'ai pas bien compris le principe est-ce possible de me donner un petit exemple avec un Tevent ?
    Imagions un Thread qui s'appel TSendBox
    AddMessage est une fonction appelé par l'un des 30 threads

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TSendBox.AddMessage(const S: string);
    var
      P: PMessageItem; // un pointer sur record
    begin
      new(P);
      P.Value := S;  
      FThreadList.Add(P) // inclu une section critique
      FEvent.SetEvent();
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    type
      PMessageItem = ^TMessageItem;
      TMessageItem = record
        Value : string;
      end;
    dans le Execute du TThread

    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
    procedure TSendBox.Execute();
    var
      TmpQueue: TList;
    begin
      while not Terminated do
      begin
        if FEvent.WaitFor(INFINITE) = wrSignaled then
        begin
          FEventLock->ResetEvent();
     
          TmpQueue := FEventQueue.LockList(); // la section critique !
          try
             Faire un truc avec chaque TmpQueue.Items[] qui sont des PMessageItem
           finally
                FEventQueue.UnlockList();
           end;
    ...
    je le fais souvent en deux ou trois temps,
    - je récupère l'élément entre LockList et UnlockList
    - je traite
    - je supprimer l'élément traité entre LockList et UnlockList

    c'est pour éviter des blocages trop long lié au traitement !
    La gestion de l'échec du traitement c'est loin d'être simple, faut-il le conserver pour le relancer, l'oublier ? ... selon les cas, je gère différemment la phase de POP dans la liste avec un système d'ACK ou NAK, de nombre de tentative avant l'abandon ... jusqu'à présent, je n'ai jamais eu de problème, la loi de Murphy's m'a épargné !

    En C++Builder, j'utilise d'autres types de liste issu de la STL couplé avec des TMultiReadExclusiveWriteSynchronizer ou TCriticalSection
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Par défaut
    Merci bien shaiLe pour l'explication aussi rapide. j'ai passé une semaine pour la comprendre quoi ! mais bon c'est pas grave je suis débutant comme même.

    Bien voilà j'ai changé un peu les choses là. Pour la surveillance du dossiers j'utilise plutôt l'API 'ReadDirectoryChangesW'. un petit bijou que j'ai trouvé sur le net (je la met e joint). je peux dans ce cas récupérer les noms des fichiers et leurs chemins dans une liste. par
    Par contre, si l'administrateur arrête l'application sur le serveur et qu'un fichier vient de s'ajouter, alors là je dois scruter le dossier si un fichier existe déja puis je lance le thread de surveillance.

    Pour l'accès à Firebird, j'ai changé aussi de librairie: j'ai choisi IBOBJECTS.

    Alors vous explique un peu comment ça fonctionne :

    une automate qui s'exécute sur le serveur et qui gère aussi les connexions clients. Elle a pour rôles :

    - surveiller un dossier principal et tous les sous dossiers.
    - Gérer les connexions clients.
    - contient aussi des procédures partagés pour les clients.
    - contient aussi les procédure d'accès à la base de données.

    Voilà, lorsque je détecte un fichier FLAG qui arrive je lance un thread de mise à jour de la base de données puis une autre thread pour faire des traitements avec une application externe.

    Et pour l'accès à la base par plusieurs thread, j'ai pensé aussi à créer autant de table. comme ça je peux garantir la cohérence des données. Bon j'ai pas essayé ceci mais bon je vais le faire.

    Enfin pour la lecture des fichiers textes et binaires j'ai utilisé le FVIEW de Dr.who vraiment c'est rapide ! Avec un record bien entendu et des champs array of ANSICHAR.

    Avec delphi tu ne pas dormir !
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/09/2014, 20h26
  2. Quel composant pour Delphi 7 avec FireBird 2.5
    Par typhon_186 dans le forum Bases de données
    Réponses: 1
    Dernier message: 01/09/2013, 07h07
  3. Déployer une application Delphi avec Firebird
    Par tchezan dans le forum Bases de données
    Réponses: 2
    Dernier message: 03/04/2008, 13h45
  4. Delphi avec FireBird 2
    Par Doucoure dans le forum Delphi
    Réponses: 2
    Dernier message: 19/02/2007, 18h02

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